Linux14--文本处理之:sed、awk命令
1 Linux三剑客之sed
Stream Editor 流式编辑器,主要擅长对文件的编辑操作,是一次处理一行内容
1.可以事先定制好编辑文件的指令,可用于同一套规则处理多个文件
2.用于处理大文件
# sed vs vim
1.sed可以把处理文件的规则事先写好,然后使用同一套规则编辑多个文件
vim只能一个个文件打开编辑
2.sed处理文件,一次只处理一行,即同一时间内存中只有文件的一行内容
无论文件多大,都不会对内存造成过大的压力
vim是一次性打开文件所有内容,到内存中。文件过大,内存有压力
# 1 格式
sed 选项 '定位+命令' 文件路径
标准输出 | sed 选项 '定位+命令'
# 2 选项
-n 取消默认输出到屏幕,即不自动打印
-r 支持扩展正则表达式
-i 直接编辑文件 # 把输出到屏幕的内容,保存到文件,包含规则处理后的结果 + 默认输出的结果
-i.bak 备份文件并原处编辑
# 3 定位
行定位:
1 :定位到第一行
1,3 :从第1行到第3行
$ :最后一行
不写定位 :定位所有行
正则表达式定位:
/egon/ :包含egon的行
/^egon/ :以egon开头的行
/egon$/ :以egon结尾的行
数字+正则表达式定位:
"1,8p" 代表打印 1到8行
"1,/egon/p" 代表打印 从第1行到首次匹配到/egon/的行
# 4 命令
d : 删除匹配行,并立即启用下一轮循环(下一行的匹配处理)
p : 打印匹配行的内容,追加到默认输出之后
s///[替换标记] : 查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g 行内全局替换
i 忽悠大小写
p 显示替换成功的行
w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中
# 命令可以用;号连接多条
eg: 1d;3d;5d 代表 删除1,3,5行
sed 案例
# 案例文件:a.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
### 用法示例:p与d 打印与删除
# 1.默认输出 所有行的文件内容 == cat a.txt
sed '' a.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
# 2.不默认输出 所有行的文件内容
sed -n '' a.txt
空
# 3.输出打印从第1行,直到含有xxx的行
sed -n '1,/xxx/p' a.txt
egon1111
22222egon
3333egon33333
4444xxx44444
# 4.删除从第1行,直到含有xxx的行,会默认输出模式空间中 规则处理后的文件内容
sed '1,/xxx/d' a.txt
5555xxx55555xxxx555xxx
6666egon6666egon666egon
# 5.删除从第1行、第3行、第5行
sed '1d;3d;5d' a.txt
22222egon
4444xxx44444
6666egon6666egon666egon
### 用法示例:s///g 查找替换
# 1.把所有行的所有egon都换成BIGEGON
sed 's/egon/BIGEGON/g' a.txt
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666BIGEGON666BIGEGON
# 2.以egon开头的行中的egon换成GAGAGA
sed '/^egon/s/egon/GAGAGA/g' a.txt
GAGAGA1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
# 3.只把第6行的第一个egon换成BIGEGON,加上g代表行内全局替换
sed '6s/egon/BIGEGON/' a.txt
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666egon666egon
# 4.把1到3行的egon换成BIGEGON
sed '1,3s/egon/BIGEGON/g' a.txt
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
# 5.把第2行的egon换成BIGEGON,并输出写入到 /root/b.txt
sed -n '2s/egon/BIGEGON/w /root/b.txt' a.txt
### 用法示例:sed也支持管道
cat a.txt | sed '1,5d'
6666egon6666egon666egon
# 注:
加上-i选项,直接修改文件,通常会在调试完毕确保没有问题后再加-i选项
2 Linux三剑客之awk
awk主要用于处理有格式的文本,eg:/etc/passwd这种
事实上awk是一门编程语言,可以独立完成很强大的操作
# 0 工作流程/原理
awk -F: '{print $1,$3}' /etc/passwd
awk -F ':' '{print $1,$3}' /etc/passwd
1.awk会读取文件的一行内容然后赋值给$0
2.然后awk会以-F指定的 输入分隔符 将该行切分成n段,
最多可以达到100段,第一段给$1,第二段给$2,依次次类推
3.print输出该行的第一段和第三段,默认OFS以空格 分割
4.重复步骤1,2,3直到文件内容读完
# 内置变量
$0 一整行内容
NR 记录号,等同于当前行的行号
NF 以-F分隔符分隔后的 字段数量
FS 输入字段分隔符,默认空白字符,一般需要加 -F,指定输入分隔符
OFS 输出字段分隔符,默认是空格,一般需要加 -v OFS="#",指定输出分隔符
FILENAME 当前文件名
# 1 格式
awk 选项 'pattern{action}' 文件路径
标准输出 | awk 选项 'pattern{action}'
# 2 选项
-F 指定行输入分隔符 默认以空白字符分隔
-v 指定内置变量的值 eg: -v OFS="#"
# 3 模式 pattern
未指定:空模式,匹配每一行
/正则/
/正则/ # 该行内容匹配成功正则
$1 ~ /正则/ # 第一段内容 与正则 匹配成功
$1 !~ /正则/ # 第一段内容 与正则 没有匹配成功
比较运算:
NR >= 3 && NR <=5 # 行号为3到5 && 且 || 或
$1 == "root" # 第一段内容等于root
$NF 每行分割后的最后一段
$(NF-1) 每行分割后的倒数第二段
# 4 操作 action
print $1,$3
awk案例
# 案例文件:a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 1.打印 以':'分割后,以root为首的行,默认用空格分割拼接的 字段1、3
awk -F: '/^root/{print $1,$3}' a.txt
root 0
# 2.打印 以':'分割后,以root为首的行,指定用'#'分割拼接的 字段1、3
awk -F: -v OFS="#" '/^root/{print $1,$3}' a.txt
awk -F: '/^root/{print $1,$3}' OFS="#" a.txt
root#0
# 3.打印 以':'分割后,第一段内容 与正则以d开头 匹配成功的,默认用空格分割拼接的 字段1、3
awk -F: '$1 ~ /^d/{print $1,$3}' a.txt
daemon 2
# 4.打印 以':'分割后,第一段内容 与正则以d开头 匹配没成功的,默认用空格分割拼接的 字段1、3
awk -F: '$1 !~ /^d/{print $1,$3}' a.txt
root 0
bin 1
adm 3
lp 4
# 5.打印 以':'分割后,行号大于3 的字段1
awk -F: 'NR>3{print $1}' a.txt
adm
lp
# 6.打印 以':'分割后,第一段内容等于"lp"的整行内容
awk -F: '$1 == "lp"{print $0}' a.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# 7.awk也支持管道
cat a.txt | awk -F: '{print $1}'
root
bin
daemon
adm
lp
分类:
Linux运维
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-06-26 20--面向对象02:封装、隐藏属性、property装饰器