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

2023-11-20


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@arslinux-01 sed]# sed -i '1,25'd test.txt
[root@arslinux-01 sed]# wc -l test.txt
3 test.txt
  • sed -i '/关键字/'d 文件 删除含有相关字符的行
[root@arslinux-01 sed]# sed -i '/user2/'d test.txt
[root@arslinux-01 sed]# cat test.txt |grep user2
[root@arslinux-01 sed]# cat test.txt |grep user3
user3:x:1004:1005::/home/user3:/bin/bash
  • 3、sed 替换功能

sed ‘行数范围s/被替换字符/要替换成的字符/g’ 文件名(不指定范围就是全部)
s/1/2/ 替换的内容
g 复制/追加hold space的内容到pattern space

  • 1-10行的 root 换为 rose
[root@arslinux-01 sed]# sed '1,10s/root/rose/g' test.txt | head
rose:x:0:0:rose:/rose:/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
ada:ro.odaf
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

这里加 head 只显示前十行

[root@arslinux-01 sed]# sed -r '1,10s/ro+/r/g' test.txt |head
rt:x:0:0:rt:/rt:/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
ada:r.odaf
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  • 将 : 分割的部分,第一段和最后一段对调
[root@arslinux-01 sed]# head test.txt | sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/NOlogin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
ada:ro.odaf
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail

根据文件内容,用 : 来分割,第一部分为非 : 字符出现1次或多次,用括号扩起做第一部分,第二部分和第一部分之间有 : 分割,第二部分贪婪匹配到最后一个 : ,第二三部分之间依然是 : 分割,第三部分是非 : 字符出现一次或多次,然后在后方将 一,三部分对调为 \3:\2:\1,后方用 “\数字” 表示每个部分

  • 分隔符用@ #都可以,这样用/ /的时候就不用加 \ 脱义
    把 /root 替换成 123
[root@arslinux-01 sed]# head test.txt | sed 's//root/123/g' 
sed:-e 表达式 #1,字符 12:“s”的未知选项
[root@arslinux-01 sed]# head test.txt | sed 's/\/root/123/g' 
root:x:0:0:root:123:/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
ada:ro.odaf
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  • 用 # 或 @ 做分隔符,无需 \ 脱义
[root@arslinux-01 sed]# head test.txt | sed 's#/root#123#g' 
root:x:0:0:root:123:/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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
ada:ro.odaf
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  • 把字母删除 = 把字母替换为空
[root@arslinux-01 sed]# head test.txt |sed 's/[a-zA-Z]//g'
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
:.
::7:0::/://
::8:12::///://
  • 把数字删除
[root@arslinux-01 sed]# head test.txt |sed 's/[0-9]//g'
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/NOlogin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
ada:ro.odaf
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
  • 所有行前面加上字符串
[root@arslinux-01 sed]# head test.txt |sed -r 's/(.*)/aaa:&/'
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/NOlogin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:ada:ro.odaf
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
aaa:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

(.) 匹配原本一行,& 表示的就是前面的 () 里的内容,将(.) 替换成 aaa:(.*),一定要 -r 脱义

参考:http://man.linuxde.net/sed

9.6/9.7 awk

  • awk -F ‘分隔符’ ‘{print $数字}’ 打印出第几段(不删文件内容,$0指全部内容)
    awk 无需脱义
  • 常用命令选项:
选项 含义
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
  • 用 : 作为分隔符,打印出第一段
[root@arslinux-01 awk]# awk -F ':' '{print $1}' passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
chrony
arslinux
user1
user2
user3
user4
user5
user6
  • 打印出所有段
[root@arslinux-01 awk]# awk '{print $0}' passwd 
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/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

打印全部内容,无需指定分隔符

awk 如果不指定分隔符,那么默认以空格或空白字符为分隔符去打印

  • 创建测试文件
[root@arslinux-01 awk]# cat 1.txt 
1 2
aa bb
dd ee
[root@arslinux-01 awk]# awk '{print $1}' 1.txt 
1
aa
dd
[root@arslinux-01 awk]# awk '{print $2}' 1.txt 
2
bb
ee
  • 打印多段内容
[root@arslinux-01 awk]# awk -F ':' '{print $1,$3,$4}' passwd 
root 0 0
bin 1 1
daemon 2 2
adm 3 4
lp 4 7
sync 5 0
shutdown 6 0
halt 7 0
mail 8 12
operator 11 0
games 12 100
ftp 14 50
nobody 99 99
systemd-network 192 192
dbus 81 81
polkitd 999 998
sshd 74 74
postfix 89 89
chrony 998 996
arslinux 1000 1000
user1 1001 1001
user2 1002 1006
user3 1004 1005
user4 1006 1005
user5 1007 1007
user6 1008 1010
  • 指定分隔符
[root@arslinux-01 awk]# awk -F ':' '{print $1"#"$3"#"$4}' passwd 
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7
sync#5#0
shutdown#6#0
halt#7#0
mail#8#12
operator#11#0
games#12#100
ftp#14#50
nobody#99#99
systemd-network#192#192
dbus#81#81
polkitd#999#998
sshd#74#74
postfix#89#89
chrony#998#996
arslinux#1000#1000
user1#1001#1001
user2#1002#1006
user3#1004#1005
user4#1006#1005
user5#1007#1007
user6#1008#1010

1、awk 匹配

  • 匹配出含有 oo 的行
[root@arslinux-01 awk]# awk '/oo/' passwd 
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
  • 匹配出第一段含有 oo 的行
[root@arslinux-01 awk]# awk -F ':' '$1 ~ /oo/' passwd 
root:x:0:0:root:/root:/bin/bash

~ 表示匹配,后接匹配的内容

  • 匹配出第一段有 o 的行
[root@arslinux-01 awk]# awk -F ':' '$1 ~ /o+/' passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • 匹配出第一段有至少两个 o 的行
[root@arslinux-01 awk]# awk -F ':' '$1 ~ /oo+/' passwd 
root:x:0:0:root:/root:/bin/bash
  • passwd 中,以 : 分段,匹配 root 的行,打印该行 1、3 段,匹配 user 的行打印该行 3、4 段
[root@arslinux-01 awk]# awk -F ':' '/root/{print $1,$3} /user/{print $3,$4}' passwd 
root 0
operator 11
1001 1001
1002 1006
1004 1005
1006 1005
1007 1007
1008 1010
  • 匹配包含 root 和 user 的行
[root@arslinux-01 awk]# awk -F ':' '/root|user/' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
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
[root@arslinux-01 awk]# awk -F ':' '/root|user/ {print $0}' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
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

2、awk 数学运算表达式

  • 匹配第三段 = 1000 的行
[root@arslinux-01 awk]# awk -F : '$3==1000' passwd 
arslinux:x:1000:1000::/home/arslinux:/bin/bash

如果只写一个 = ,那么会把所有行第三段赋值成 1000 并打印

  • 匹配第三段 = 1000 的行,并打印出第 1 和 7 段
[root@arslinux-01 awk]# awk -F : '$3==1000{print $1,$7}' passwd 
arslinux /bin/bash
  • 匹配第三段 > = 1000 的行
[root@arslinux-01 awk]# awk -F : '$3>=1000' passwd 
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

★如果数字加上 " " ,会ASCII排序方式也就是字符串的顺序来算的,而不是按数字来算

[root@arslinux-01 awk]# awk -F : '$3>="1000"' passwd 
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/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
  • 匹配第七段不 = /sbin/nologin 的行(匹配的内容如果是字符串需要加双引号)
[root@arslinux-01 awk]# awk -F : '$7!="/sbin/nologin"' passwd 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
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
user5:x:1007:1007::/home/user5:/bin/bash

3、两个字段比较大小

  • 匹配第三段比第四段小的行
[root@arslinux-01 awk]# awk -F : '$3<$4' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
user2:x:1002:1006::/home/user2:/bin/bash
user3:x:1004:1005::/home/user3:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash
  • 匹配第三段和第四段相等的行
[root@arslinux-01 awk]# awk -F : '$3==$4' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/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
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
arslinux:x:1000:1000::/home/arslinux:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user5:x:1007:1007::/home/user5:/bin/bash
  • 匹配第三段大于字符 5,且小于字符 8 的行
[root@arslinux-01 awk]# awk -F : '$3>"5" && $3<"8"' passwd 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  • 匹配第三段大于数字 1000,或者第七段等于/sbin/nologin 的行
[root@arslinux-01 awk]# awk -F : '$3>1000 || $7=="/sbin/nologin"' passwd 
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
mail:x:8:12:mail:/var/spool/mail:/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
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
  • 匹配第七段包含 bash 的行
[root@arslinux-01 awk]# awk -F : '$7 ~ /bash/' passwd 
root:x:0:0:root:/root:/bin/bash
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
user5:x:1007:1007::/home/user5:/bin/bash
user6:x:1008:1010::/home/user6:/bin/bash

4、内置变量 OFS

指定打印时的分隔符:{OFS=’ '} 要在print前使用
指定目前的分隔符;OFS指定要改为什么分隔符;条件(不写条件就是全部);打印的段

  • 匹配第七段包含 bash 的行,并打印出第1,3,7段,且用#分割各段
[root@arslinux-01 awk]# awk -F : '{OFS="#"} $7 ~ /bash/{print $1,$3,$7}' passwd 
root#0#/bin/bash
arslinux#1000#/bin/bash
user1#1001#/bin/bash
user2#1002#/bin/bash
user3#1004#/bin/bash
user5#1007#/bin/bash
user6#1008#/bin/bash
  • if 条件,后面为一个部分
[root@arslinux-01 awk]# awk -F : '{OFS="#"}{if ($3>1000){print $1,$2,$3,$4}}' passwd 
user1#x#1001#1001
user2#x#1002#1006
user3#x#1004#1005
user4#x#1006#1005
user5#x#1007#1007
user6#x#1008#1010
[root@arslinux-01 awk]# awk -F : '{OFS="#"}$3>1000{print $1,$2,$3,$4}' passwd 
user1#x#1001#1001
user2#x#1002#1006
user3#x#1004#1005
user4#x#1006#1005
user5#x#1007#1007
user6#x#1008#1010

上面两种是同一个意思,前一种更规整

  • 内置变量NR 表示行号
[root@arslinux-01 awk]# awk -F : '{print NR":"$0}' passwd 
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20:arslinux:x:1000:1000::/home/arslinux:/bin/bash
21:user1:x:1001:1001::/home/user1:/bin/bash
22:user2:x:1002:1006::/home/user2:/bin/bash
23:user3:x:1004:1005::/home/user3:/bin/bash
24:user4:x:1006:1005::/home/arslinux:/sbin/nologin
25:user5:x:1007:1007::/home/user5:/bin/bash
26:user6:x:1008:1010::/home/user6:/bin/bash
  • 内置变量NF 表示段号
[root@arslinux-01 awk]# awk -F : '{print NF":"$0}' passwd 
6:rootx:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7:halt:x:7:0:halt:/sbin:/sbin/halt
7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
7:operator:x:11:0:operator:/root:/sbin/nologin
7:games:x:12:100:games:/usr/games:/sbin/nologin
7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7:nobody:x:99:99:Nobody:/:/sbin/nologin
7:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
7:dbus:x:81:81:System message bus:/:/sbin/nologin
7:polkitd:x:999:998:User for polkitd:/:/sbin/nologin
7:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
7:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
7:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
7:arslinux:x:1000:1000::/home/arslinux:/bin/bash
7:user1:x:1001:1001::/home/user1:/bin/bash
7:user2:x:1002:1006::/home/user2:/bin/bash
7:user3:x:1004:1005::/home/user3:/bin/bash
7:user4:x:1006:1005::/home/arslinux:/sbin/nologin
7:user5:x:1007:1007::/home/user5:/bin/bash
7:user6:x:1008:1010::/home/user6:/bin/bash

第一段改为 6 行后,可以看到区别

  • 匹配出前十行
[root@arslinux-01 awk]# awk -F : 'NR<=10' passwd 
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
  • 匹配前十行里,第一段包含 root 或者 sync 的行
[root@arslinux-01 awk]# awk -F : 'NR<=10 && $1 ~ /root|sync/' passwd 
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
  • 匹配有6段的行里,第一段包含 root 或者 sync 的行
[root@arslinux-01 awk]# awk -F : 'NF==6 && $1 ~ /root|sync/' passwd 
rootx:0:0:root:/root:/bin/bash
[root@arslinux-01 awk]# awk -F : 'NF==6' passwd 
rootx:0:0:root:/root:/bin/bash
  • 匹配 $行号 : $段数
[root@arslinux-01 awk]# awk -F : '{print $NR":"$NF}' passwd 
rootx:/bin/bash
x:/sbin/nologin
2:/sbin/nologin
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown
:/sbin/halt
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/sbin/nologin
:/bin/bash
:/bin/bash
:/bin/bash
:/bin/bash
:/sbin/nologin
:/bin/bash
:/bin/bash

第一行为第一行的 $1:$7,第二行为第二行的 $2:$7 。。。第八行没有 $8,所以不存在

  • 匹配第一段为 root 的行,后一段表示 将第一段赋值为 root
[root@arslinux-01 awk]# head -3 /etc/passwd | awk -F : '$1=="root"'
root:x:0:0:root:/root:/bin/bash
[root@arslinux-01 awk]# head -3 /etc/passwd | awk -F : '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
  • 增加分隔符
[root@arslinux-01 awk]# head -3 /etc/passwd | awk -F : '{OFS="#"}$1="root"'
root#x#0#0#root#/root#/bin/bash
root#x#1#1#bin#/bin#/sbin/nologin
root#x#2#2#daemon#/sbin#/sbin/nologin

5、需求

1)tot 求和

[root@arslinux-01 awk]#  awk -F : '{tot=tot+$3};END {print tot}' passwd 
9633

每次循环都会将第三段的值相加
tot=tot+$3,第一次循环是 0 + 第一行的第三段,第二次循环是 第一行的第三段 + 第二行的第三段,第三次循环是 前面的和 + 第三行的第三段,以此类推

2)if 判断
如果第一段是user1,那么打出所有行。就是打印第一段为user1的行

[root@arslinux-01 awk]# awk -F : '{if($1=="user1"){print $0}}' passwd 
user1:x:1001:1001::/home/user1:/bin/bash
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【9.19】正则表达式——sed、awk 的相关文章

随机推荐

  • [思维模式-15]:《复盘》-3- “行”篇 - 操作复盘- 个人复盘

    目录 前言 一 将军不是教出来的 而是打出来的 二 复盘是能力提升的有效方式 三 对什么进行个人复盘 1 新的事 2 重要的事 3 有价值的事 4 按照规范 惯例处置不太奏效的事件 未达预期的事 四 个人复盘的两种操作手法 1 自我简易复盘
  • cisco 小型园区与网络的构建及其应用

    一 实验目的 熟练构建小型区域网络 二 实验设备 Cisco 2811 路由器 6台 cisco 3650 交换机 6台 cisco 2960 交换机7台 pc机8台 服务器6台 数据线缆若干 三 实验拓扑 四 实验步骤
  • applicationContext.xml第一行无缘无故报错!!!

    eclipse的bug 在projects里clean一下 就好了 右键project的validate不管用
  • python实现OCR识别图片验证码

    用cv2模块读取和显示模块 导包cv2拓展模块 import cv2 先给窗体起名字 cv2 namedWindow ShowImage1 cv2 namedWindow ShowImage2 image1 cv2 imread img01
  • 04757信息系统开发与管理2011版考试大纲思维导图

    第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 不考 思维导图下载地址 MindMaster绘制 链接 https pan baidu com s 1U BRcRyUgZ8QUqlDuOLy w pwd qwzt 提
  • 通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题

    通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题 问题 当 raft group 发生脑裂的情况下 老的 raft leader 可能在一段时间内并不知道新的 leader 已经被选举出来 这时候
  • C语言冒泡排序和选择排序

    一 冒泡排序法 假设从小到大排序 例一数组 int arr 2 1 34 5 arr 0 先跟相邻的arr 1 比较大小 如果比它大则交换两个数值位置 大的数值放在后面 然后比较arr 1 和arr 2 的大小 以此类推 直至第n 2个和第
  • MCDF实验——Lab0

    MCDF实验 一 MCDF功能描述 二 设计结构 三 接口描述 1 系统信号接口 2 通道从端接口 3 整形器接口 4 控制寄存器接口 四 接口时序 1 通道从端接口时序 2 整形器接口时序 3 控制寄存器接口时序 五 寄存器描述 1 地址
  • day4-Django的model

    目录 1 setting文件配置 2 理解models 3 model定义 4 常用字段类型 5 常用属性 6 数据库迁移 7 Meta类 1 setting文件配置 sqlite数据库 DATABASES default ENGINE d
  • AIGC潮水中,重新理解低代码

    如果将一句话生成应用形容成L4级的 无人驾驶 伙伴云的 AI搭建 则更像L2 级的 辅助驾驶 作者 斗斗 出品 产业家 2023年 AIGC下的低代码赛道 暗流涌动 对于 AI搭建 的搭建效果 尤其是在场景覆盖的广度上 连我自己也感觉比较意
  • Qt Creator创建C++(Day1)

    利用Qt Creator创建纯C 项目流程 1 如下图所示 按照序号选择即可 2 更改名字和选择保存路径 3 点击 下一步 4 直接点击 完成 注意事项 如果在控制台输出中文乱码修改过程如下 1 选中 工具 选项 2 将 UTF 8 改为
  • 语音活性检测器 webrtcvad

    目录 概述 安装 使用脚本 1 测试静音片段 2 清理静音片段 概述 WebRTC是一个免费 开放的框架 项目 使web浏览器通过简单的JavaScript api接口实现实时通信功能 WebRTC An open framework fo
  • 动态规划之多重背包模型

    前置知识 01背包问题 动态规划之01背包模型 如何何何的博客 CSDN博客 完全背包问题 动态规划之完全背包模型 如何何何的博客 CSDN博客 多重背包问题 给定一个有一定容量的背包 和 n 个物品 每个物品有 si 件 每个物品有其对应
  • taoCMS v3.0.2 任意文件上传漏洞(CVE-2022-23880)

    靶标介绍 taoCMS v3 0 2 文件管理处存在任意文件上传漏洞 攻击者可执行任意代码 漏洞复现 1 使用御剑扫描后台 或者直接输入 admin 就会跳转到登录界面 弱口令尝试 账号admin 密码tao 2 在文件管理处 新建文件为1
  • CVPR 2023

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉和Transformer 交流群 作者 Oliiiver 源 知乎 编辑 CVer公众号 https zhuanlan zhihu com p
  • 使用TensorFlow Lite将深度学习模型部署到IOT系统

    使用TensorFlow Lite将深度学习模型部署到IOT系统 TensorFlow Lite简介 移动设备深度学习框架是部署在手机或者树莓派等小型移动设备上的深度学习框架 可以使用训练好的模型在手机等设备上完成推理任务 这一类框架的出现
  • yolov5--完全炼丹指南

    目录 前言 炼丹方法 收集数据集 划分数据集 yolov5模型训练 简单提升训练效果的措施 关于参数的说明 结语 前言 最近在做yolov5识别手势的项目 爬了很多坑 也排除了不少bug 记录一下 参考前人的经验 遇到写得好的文章我会推荐
  • 打印出1-10000之间的所有对称数(如121,1331,2442)。

    练习题 打印出1 10000之间的所有对称数 如121 1331 2442 自己写的代码 var isSym function num var str for var i 1 i lt 9 i 如果个位算 可去掉注释 str i str f
  • 干掉广告和钓鱼,这款神器绝了!

    大家好 我是良许 前几天 搜狐丢人丢大发了 自家的员工居然遭遇了钓鱼诈骗 据报道 某员工使用邮件时被意外钓鱼导致密码泄露 进而被冒充财务部盗发邮件 共有 24 名员工被骗取 4 万余元 要知道 搜狐可是国内最早的四大门户网站之一 同时也是国
  • 【9.19】正则表达式——sed、awk

    9 19 正则表达式 sed awk 9 4 9 5 sed 1 sed 匹配 2 sed打印具体行数 3 sed 替换功能 9 6 9 7 awk 1 awk 匹配 2 awk 数学运算表达式 3 两个字段比较大小 4 内置变量 OFS