您的位置:首页 > 运维架构 > Linux

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

2020-03-06 18:55 417 查看

3.2、三剑客之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表示全局替换
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 [参数] ‘[!]模式-动作’ 文件
常用选项:
-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
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
Rose_die 发布了6 篇原创文章 · 获赞 7 · 访问量 282 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: