02 文本处理

1 文本编辑工具vim

1.1 vim三种模式和转换

三种模式:命令模式、插入模式、扩展命令模式;

命令模式--插入模式,常用:
i  在光标处输入
A  在光标所在行的行尾输入

插入模式--命令模式,按ESC切换

命令模式--扩展命令模式,输入":"

1.2 命令模式

##在命令模式下直接输入如下字符

##定位
G	最后一行
1G	第一行
#G	第#行

##输入
i	在光标处输入
A	在光标所在行的行尾输入

##d删除
d	删除,可结合行号
dd	删除当前行
d$	删除到行尾
d^  删除到非空行首
d0	删除到行首
dG	删除到最后一行
d#G	删除到#行

##y复制;p粘贴到下一行
y	复制,行为相似于d命令
yy	复制当前行
yG	复制到最后一行
##/?查找
/PATTERN	从当前光标所在处向文件尾部查找 
?PATTERN	从当前光标所在处向文件首部查找 
n	与命令同方向
N	与命令反方向
##撤销重复
u	撤销最近的更改
.	重复前一个操作

1.2 扩展命令模式

##常用扩展命令,在命令模式下输入:
:wq  写入并退出
:q!  不保存退出
:set number  显示行号
:set ignorecase  后续可以使用/查询忽略大小写
:set list	显示tab^I和换行符$
:set hlsearch	高亮搜索
##与查找替换结合使用
/pattern/	当前行向下查找,直到匹配的第一行
/pat1/,/pat2/	从第一次被pat1模式匹配到的行开始, 一直到第一次被pat2匹配到的行结束
##查找替换
s/要查找的内容/替换为的内容/修饰符
i   #忽略大小写
g   #全局替换,默认情况下,每一行只替换第一次出现 

范例
:%s/old/new/g	整个文件所有old替换为new
:/head/,/tail/s/OLD/new/ig	首次匹配到head到首次匹配到tail的行,不论大小写将OLD替换为new

2 文本常见处理工具

2.1 cat查看文本内容

##-A	显示所有控制符
##-n	每一行编号
##可用于非交互式生成sh文件,后续写脚本时可以用到

[root@anolis-31 ~]$cat >>sayhello.sh<<EOF
> echo hello
> echo $HOSTNAME
> EOF

[root@anolis-31 ~]$bash sayhello.sh
hello
anolis-31.wang.org

2.2 head/tail显示

##head
##-c #    指定获取前#字节
##-n #    指定获取前#行

##如,取随机数前6个字符,可作为随机密码;
[root@anolis-31 ~]$cat /dev/random | tr -dc 'a-zA-Z0-9' | head -c 6

##tail
#-c #    指定获取后#字节
#-n #    指定获取后#行 ,如果#是负数 ,表示从第#行开始到文件结束
#-f      跟踪显示文件fd新追加的内容 ,常用日志监控

##如,跟踪日志文件,很常用
[root@anolis-31 ~]$tail -f /var/log/zabbix/zabbix_agentd.log

2.3 wc/sort/uniq文本分析

##wc统计文本数据
[root@anolis-31 ~]$wc  /etc/passwd
  27   46 1257 /etc/passwd
##只计算行数
[root@anolis-31 ~]$wc -l /etc/passwd
27 /etc/passwd
##单词数
[root@anolis-31 ~]$wc  /etc/passwd -w
46 /etc/passwd
##字符数
[root@anolis-31 ~]$wc  /etc/passwd -c
1257 /etc/passwd
##sort排序
##-r 执行反方向(由上至下)整理
##-n 执行按数字大小整理
##-u 选项(独特, unique),合并重复项,即去重 

##范例,查看分区使用率,最多的排序
[root@anolis-31 ~]$df | awk '{print $(NF-1)}' | sort -r
已用%
20%
15%
1%
0%
##uniq去重
##-c: 显示每行重复出现的次数
##-d: 仅显示重复过的行
##-u: 仅显示不曾重复的行

##范例,配合sort,后续可以统计日志访问量等
[root@anolis-31 ~]$sort /etc/passwd | uniq -c

3 常用正则表达式

##正则表达式用于处理文本内容,通配符用于处理文件名
##字符匹配
.    匹配任意单个字符(除了\n),可以是一个汉字或其它国家的文字
[]   匹配指定范围内的任意单个字符,示例: [wang]   [0-9]    [a-z]   [a-zA-Z]
[^]  匹配指定范围外的任意单个字符 ,示例: [^wang]

[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白
##次数匹配
*       #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 
.*      #任意长度的任意字符
\?      #匹配其前面的字符出现0次或1次 ,即:可有可无
\+      #匹配其前面的字符出现最少1次 ,即:肯定有且 >=1 次
##位置锚定
^	#行首锚定 , 用于模式的最左侧
$	#行尾锚定,用于模式的最右侧

^PATTERN$	#用于模式匹配整行
^$	#空行
^[[:space:]]*$	#空白行

\<\b	#词首锚定,用于单词模式的左侧
\>\b	#词尾锚定,用于单词模式的右侧
\<PATTERN\>	#匹配整个单词


##范例,^$精确确认整行匹配,避免修改错误
[root@anolis-31 ~]$sed -n '/^SELINUX/p' /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
[root@anolis-31 ~]$sed -n '/^SELINUX=disabled$/p' /etc/selinux/configSELINUX=disabled

##范例,显示行首非注释
[root@anolis-31 ~]$grep '^[^#]' /etc/fstab
##\(\)分组,\|或关系
##将多个字符捆绑在一起,当作一个整体处理,如: \(pattern\)
##这些变量的命名方式为: \1, \2, \3。\0 表示正则表达式匹配的所有字符

##范例,将selinux=作为变量,后续\1引用
[root@anolis-31 ~]$sed -i.bak 's/^\(SELINUX=\)disabled$/\1enable/' /etc/selinux/config
[root@anolis-31 ~]$grep '^SELINUX=' /etc/selinux/config
SELINUX=enable
##还原
[root@anolis-31 ~]$sed -i.bak 's/^\(SELINUX=\).*/\1disabled/' /etc/selinux/config
[root@anolis-31 ~]$grep '^SELINUX=' /etc/selinux/config
SELINUX=disabled

##\|或
[root@anolis-31 ~]$grep 'selinux=\|SELINUX=' /etc/selinux/config
# SELINUX= can take one of these three values:
SELINUX=disabled
##扩展正则表达式,基本无\
字符匹配
. 任意单个字符
[wang] 指定范围的字符
[^wang] 不在指定范围的字符
[:alnum:] 字母和数字

次数匹配
*       匹配前面字符任意次 
?       0或1次
+       1次或多次
{n}     匹配n次

位置锚定
^	行首
$	行尾

分组,或
() 分组,后向引用:\1, \2, ... 注意 : \0 表示正则表达式匹配的所有字符
| 或者

4 文本处理grep/sed/awk常用功能

4.2 grep搜索

##grep 文本搜索工具,打印匹配到的行
##-v  显示不被pattern匹配到的行 ,即取反
##-i  忽略字符大小写 
##-n  显示匹配的行号
##-C #    context, 前后各#行
##-E  使用ERE,相当于egrep

##范例,过滤$空行、#注释
[root@anolis-31 ~]$grep -Ev '^$|#' /etc/fstab
##显示selinux前后三行内容
[root@anolis-31 ~]$grep -C 3 -i selinux /etc/selinux/config

4.3 文本处理sed

##sed从文件或管道中读一行,处理一行,输出一行,直到最后
##-n            不输出模式空间内容到屏幕,即不自动打印 
##-E        使用扩展正则表达式
##-i.bak        备份文件并原处编辑

##地址格式,默认全文
##/pattern/:被此处模式所能够匹配到的每一行
##/pat1/,/pat2/:从par1 到pat2

##扩展命令
##p           打印当前模式空间内容,追加到默认输出之后 
##Ip          忽略大小写输出
##d           删除模式空间匹配的行,并立即启用下一轮循环
##a [\]text   在指定行后面追加文本,支持使用\n实现多行追加

##范例,显示后删除所有空行、注释行
[root@anolis-31 ~]$sed -En '/^$|#/p' /etc/fstab
[root@anolis-31 ~]$sed -E -i.bak '/^$|#/d' /etc/fstab


##s///查找替换
##g   行内全局替换
##p   显示替换成功的行
##I,i   忽略大小写

##范例,修改nginx80端口
[root@anolis-31 ~]$sed -n -E '/listen +80/p' /etc/nginx/nginx.conf
        listen      80 default_server;
[root@anolis-31 ~]$sed -i.bak -E 's/listen +80/listen 8080/' /etc/nginx/nginx.conf

##范例,取基名,目录名
[root@anolis-31 ~]$echo "/etc/sysconfig/network-scripts/" |sed -r 's#(^/.*/)([^/]+/?)#\2#'
network-scripts/
[root@anolis-31 ~]$echo "/etc/sysconfig/network-scripts/" |sed -r 's#(^/.*/)([^/]+/?)#\1#'
/etc/sysconfig/

4.4 文本处理awk

##awk用于处理格式化的文件,默认支持扩展正则表达式
##-v	变量
##-F	分隔符,相当于变量FS
##列:变量NF,$1,$2....$NF
##行:变量NR,
##输入字段分隔符:FS;输出字段分隔符:OFS;

##过滤行
##字符串过滤://
##比较操作符:==, !=, >, >=, <, <=
##模式匹配符:~   左边是否和右边匹配,包含关系;!~  是否不匹配
##逻辑操作符:&&且 ||或 !反


##范例:获取分区利用率,不要首行说明
[root@anolis-31 ~]$df | awk -v FS=' ' -v OFS='目录' 'NR!=1{print $5,$6}'
0%目录/dev
0%目录/dev/shm
1%目录/run
0%目录/sys/fs/cgroup
15%目录/
20%目录/boot
0%目录/run/user/0
范例:检查将连接数过高的IP放入黑名单拒绝访问
[root@centos8 ~]#cat deny_dos.sh
#!/bin/bash
set -o nounset
echo hello1
set -o errexit

LINK=100
while true;do
	ss -nt | awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}' |sort |uniq - c|while read  count ip;do
		if [ $count -gt $LINK ];then
			iptables -A INPUT -s $ip -j REJECT 
		fi
	done 
done

[root@centos8 ~]#chmod +x /root/deny_dos.sh 
[root@centos8 ~]#crontab  -e
[root@centos8 ~]#crontab  -l
*/10 * * * *    /root/deny_dos.sh


[root@centos8 ~]#cat deny_dos2.sh
#!/bin/bash
set -o nounset
echo hello1
set -o errexit
IPLIST=`awk -F" +|:" '/^ESTAB/{print $(NF-2)}' ss.log |sort |uniq -c|sort - nr|head -3|awk '{print $2}'`
for ip in $IPLIST;do
	iptables -A INPUT -s  $ip -j REJECT
done
posted @   szlhwei  阅读(16)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示