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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!