Linux文本处理三剑客(grep、sed、awk)及正则表达式(下)

3.2、三剑客之sed

sed是一个流编辑器,非交互式的流编辑器,它每次只处理一行内容,在处理时,把当前处理的行存储到临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,就这样不断重复处理,直到文件的末尾。
用法: sed [OPTION]… {script-only-if-no-other-script} [input- file]
常用指令参数:
p: 输出当前模式空间的内容
a: 在指范围后追加内容,可用\n实现多行追加
=:显示行号
i:在指定范围前插入内容,可用\n实现多行插入
s:代替。(substitute)s///g、s###g、s@@@g g表示行内全局替换 s///gi:忽略大小写 ;s//&/g-------> &:在行后面追加指定内容
c:替换
常用选项参数:
w:匹配到的行写到指定文件
-r:支持扩展正则表达式
-e:允许多项编辑
-i:直接编辑源文件
-n :取消静默输出。只显示匹配处理的行
注意:-ni选项会将文件内容清空
增:

//在第一行后追加add
[root@localhost ~]# sed '1aadd' test2.txt
//在最后一行后追加add
[root@localhost ~]# sed ' $ aadd' test2.txt
//在末添加多行内容
[root@localhost ~]# sed '$aadd\nnidaye' test2.txt
	//在A行后面添加B并且在C行后面添加D
[root@localhost ~]# sed -e'/A/aB' -e '/C/aD' test.txt

删:

//删除第3行的内容
[root@localhost ~]# sed '3d' test.txt 
//删除第3到7行的内容
[root@localhost ~]# sed '3,7d' test.txt 
//删除有sb的行
[root@localhost ~]# sed '/sb/d' test.txt 
//只删除第3行和第5行
[root@localhost ~]# sed '3d;5d' test.txt 
//删除空行
[root@localhost ~]# sed '/^$/d' test.txt
//删除sb的行
[root@localhost ~]# sed 's/sb//g' test.txt 

查:

//不打印第一行的内容 
[root@localhost ~]# sed -n '1!p' test2.txt
//打印1到3行的内容
[root@localhost ~]# sed -n '1,3p' test2.txt 
//找出有A或者B的行
[root@localhost ~]# sed -n '/A/p;/B/p' test.txt 
//打印IP地址【反向引用(只要括号里的内容)】
[root@localhost ~]# ip a s ens33|sed -n '3p'|sed -r 's#^.*net(.*)#\1#g'|sed -r 's#(.*)/24.*#\1#g'
[root@localhost ~]# ip a s ens33|sed -n '3p'|sed -r 's#^.*net (.*)/24.*#\1#g'
[root@localhost ~]# ip a s ens33|sed -nr '3s#^.*net (.*)/24.*#\1#gp'

改:

//替换第七行内容
[root@localhost ~]# sed '7c SELINUX=Disabled' /etc/selinux/config 
//men改为man
[root@localhost ~]# sed 's/men/man/g' test.txt 
//修改原文件前自动备份(在当前目录下会自动生成一个test.txt.bak的文件)
[root@localhost ~]# sed -ri.bak 's/dilireba/nidaye/g' test.txt
//批量重命名文件
[root@localhost tet]# ls bab*.txt|sed -r 's/(.*)txt/& \1jpg/g'
bab0.txt bab0.jpg

3.3、三剑客之awk

awk是一种编程语言,用于在Linux/Unix下对文本和数据进行处理,数据可以来自标准输入、一个或多个文件,或者其它命令的输出,它通常配合脚本使用,是一个强大的文本处理工具。awk处理数据的方式为:
逐行扫描文件,从第一行到最后一行,寻找匹配到的特定模式的行,在行上进行操作,如果没有指定处理动作,则把匹配的行显示到标准输出;如果没有指定模式,则所有操作的行都被处理。
用法: awk [参数] ‘[!]模式-动作’ 文件
常用选项:
-F:指定字段分隔符
-v:自定义变量
内置变量:
NF:字段总数量,$NF表示最后一个字段
NR:行
FS:输入行字段分隔符
$(NF-n):去倒数第几列
模式匹配符:
~:匹配
!~:不匹配

//找出第2行的内容
[root@localhost ~]# awk 'NR==2' test.txt
//找出第2到第4行的内容
[root@localhost ~]# awk 'NR==2,NR==4' test.tx
//仅找出第2和第4行的内容
[root@localhost ~]# awk 'NR==2;NR==4' test.txt
//-------------------打印有BB的行
[root@localhost ~]# awk '/BB/{print $2$3}' test.txt 
546345:325423534:324:213  //连在一起
[root@localhost ~]# awk '/BB/{print $2,$3}' test.txt   //加个逗号以空格分开
546345 :325423534:324:213
[root@localhost ~]# awk '/BB/{print $2","$3}' test.txt //以逗号分隔
546345,:325423534:324:213
[root@localhost ~]# awk '/BB/{print $2','$3}' test.txt //懵逼了
546345 :325423534:324:213
//-----------------------------数值减掉了1
[root@localhost ~]# awk -F"[ :]+" '{print $5-1}' test.txt 
 23441
 63455
[root@localhost ~]# awk -F"[ :]+" '{print $(5-1)}' test.txt  //打印倒数第2列
34242
435345
[root@localhost ~]# 
//只匹配第3列以123开头的行
[root@localhost ~]# awk '$3~/^123/{print $1,$2,$3}' test.txt
//第3列匹配以1或5结尾的行
[root@localhost ~]# awk '$3~/(1|5)$/{print $1,$2,$3}' test.txt 
3dilireba sad 2353571235
4jxj sada 123546345
[root@localhost ~]# awk '$3~/[15]$/{print $1,$2,$3}' test.txt 
3dilireba sad 2353571235
4jxj sada 123546345
[root@localhost ~]# awk '$3~/[15]$/{print $1,$2}' test.txt //把$3去掉就不显示第3列了
3dilireba sad
4jxj sada
//在匹配到的行把:替换为_
[root@localhost ~]# awk '$1~/jxj/{gsub(/:/,"_",$NF);print $NF}' test.txt
//统计空行
[root@localhost ~]# awk '/^$/{i++;print i}' /etc/services
[root@localhost ~]# awk '/^$/{i++}END{print i}' /etc/services
//统计普通用户数量
[root@localhost ~]# awk '$NF~/\/bin\/bash/{i++}END{print i}' /etc/passwd
发布了11 篇原创文章 · 获赞 11 · 访问量 5969

猜你喜欢

转载自blog.csdn.net/nmb_jiang/article/details/104547894