【9.19】正则表达式——sed、awk

本文深入讲解了Linux文本处理工具sed和awk的使用,包括匹配、打印特定行、替换功能以及awk的数学运算表达式和字段比较。通过实例演示了如何利用sed实现grep的功能,以及awk在处理分隔符、匹配和数学运算上的应用。
摘要由CSDN通过智能技术生成


https://blog.51cto.com/11530642/2376266

9.4/9.5 sed

  • sed 的优势在于替换指定的字符
    sed 如何实现 grep 的功能?

  • sed '/关键词/'p 文件(p不可少) 匹配关键字,类似于 grep

  • sed '数字’p 文件 打印具体一行

常用选项 含义
-n 静默输出(–quite --silent)
-r 脱义
-e 一个表达式做多个操作
-i 删除文件中的内容
p print 打印
d delete 删除
  • 1、sed 匹配

过滤出含有 root 的行

[root@arslinux-01 sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  • 过滤出 r*t 的行
[root@arslinux-01 sed]# sed -n '/r*t/'p test.txt
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
roooooooooooooooot
  • -r 脱义,+ 作为符号,前方的 o 出现 1 次或多次
[root@arslinux-01 sed]# sed -nr '/o+t/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
roooooooooooooooot
  • o 出现 2 次
[root@arslinux-01 sed]# sed -nr '/o{2}/'p test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/NOlogin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
roooooooooooooooot
  • | root 或者 bus
[root@arslinux-01 sed]# sed -nr '/root|bus/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
  • 2、sed打印具体行数

  • 打印第 2 行
[root@arslinux-01 sed]# sed -n '2'p test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
  • 打印 2 到 5 行
[root@arslinux-01 sed]# sed -n '2,5'p test.txt
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

打印 25 到末行

[root@arslinux-01 sed]# sed -n '25,$'p test.txt
user4:x:1006:1005::/home/arslinux:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
roooooooooooooooot
  • 打印所有行
[root@arslinux-01 sed]# sed -n '1,$'p test.txt
  • sed -e 一个表达式做多个动作
  • 打印出第一行的同时,匹配 bus 的行
[root@arslinux-01 sed]# sed -e '1'p -e '/bus/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin

如果 -e 操作的前方和后方操作结果一样,那么会打印两次

[root@arslinux-01 sed]# sed -e '1'p -e '/root/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  • 匹配三个关键字
[root@arslinux-01 sed]# sed -e '1'p -e '/root/'p -e '/oo*/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
ada:ro.odaf
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
arslinux:x:1000:1000::/home/arslinux:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1006::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user4:x:1006:1005::/home/arslinux:/sbin/nologin
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
roooooooooooooooot
  • 不区分大小写,在 p 前加大写 I
[root@arslinux-01 sed]# sed -n '/bus/'Ip test.txt
BUSnobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
  • 删除指定的行(只是在结果中删除)
    删除 1 到 25 行,把其余显示出来
[root@arslinux-01 sed]# sed '1,25'd test.txt
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
roooooooooooooooot

如果想删除前 5 个月的日志,只保留最近一个月的日志,那么可以 grep -n 利用时间戳,过滤出要删除的行的行号,然后通过 sed '行数’d 来删除

  • 在文件中删除指定的行
  • sed -i '数字’d 文件 删除指定的行
[root@arslinux-01 sed]# cp test.txt test.txt.bak
[root@ar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值