[root@hf-01 ~]# mkdir awk
[root@hf-01 ~]# cd awk
[root@hf-01 awk]# cp /etc/passwd ./test.txt
[root@hf-01 awk]# ls
test.txt
[root@hf-01 awk]# awk -F ':' '{print $1}' test.txt //打印出第一段内容
root
bin
daemon
adm
lp
sync
shutdown
halt
等等等,只截取了一小部分
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1}'
root
bin
daemon
[root@hf-01 awk]#
awk命令以分隔符为例,打印出第一段内容——>实际上并未去改变文件内容
[root@hf-01 awk]# awk -F ':' '{print $0}' test.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
sync:x:5:0:sync:/sbin:/bin/sync
等等等,只截取了一小部分
[root@hf-01 awk]#
打印第一段用 $1 表示 打印所有的段用 $0 表示
[root@hf-01 awk]# awk -F ':' '{print $1,$2,$4}' test.txt
root x 0
bin x 1
daemon x 2
adm x 4
lp x 7
sync x 0
shutdown x 0
等等等,只截取了一小部分
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1"@"$2"@"$4}' //在前三行中,打印指定的段,并用 @ 分割
root@x@0
bin@x@1
daemon@x@2
[root@hf-01 awk]#
[root@hf-01 awk]# awk '/oo/' test.txt //打印匹配包含字符oo的行
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
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$1 ~ /o+/' test.txt //匹配第一段中包含o字符的行
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
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$1 ~ /oo+/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
这里会发现,有特殊符号的时候,grep命令需要加 -E 脱义,sed命令需要加 -r 脱义,而awk命令中的特殊符号则不需要脱义就可以实现操作
[root@hf-01 awk]# awk -F ':' '/root/ {print $1,$3} /usr/ {print $1,$3,$4}' test.txt //匹配包含root的行,打印第1段和第3段,然后在匹配包含usr的行并打印第3段和第4段
root 0
operator 11
games 12 100
[root@hf-01 awk]# grep -E 'root|usr' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '/root|usr/ {print $0}' test.txt //在文件所有段中,匹配包含root和usr的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
[root@hf-01 awk]# awk -F ':' '/root|usr/ {print $1,$3,$4}' test.txt
root 0 0
operator 11 0
games 12 100
[root@hf-01 awk]#
awk工具支持多个表达式一起写
[root@hf-01 awk]# awk -F ':' '$3==0' test.txt //匹配第3段等于0的,并打印所有段
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]# awk -F ':' '$3==0 {print $1}' test.txt //匹配第3段等于0的,并打印第1段
root
[root@hf-01 awk]# awk -F ':' '$3>=1000 {print $0}' test.txt //匹配第3段大于等于1000的,并打印所有段
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$3>="1000" {print $0}' test.txt
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
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/bin/bash
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt //匹配打印出第7段不等于/sbin/nologin的所有段
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
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@hf-01 awk]#
[root@localhost awk]# awk -F ':' '$3<$4' test.txt //比较第3段小于第4段的,并匹配打印出来
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
[root@localhost awk]#
[root@localhost awk]# awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行
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
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost awk]#
[root@localhost awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大于5的字符,和小于7的字符,并打印出来所在行
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:/var/spool/postfix:/sbin/nologin
[root@localhost awk]#
这里的59是是在字符5和字符7之间的,所以就会匹配出来
[root@localhost awk]# vim test.txt
[root@localhost awk]# awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大于94的段,或者第7段等于/sbin/nologin的段所在的行都打印出来
yroot:x:95:95:root:/root
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
等等等,只截取了一部分
[root@localhost awk]#
[root@localhost awk]# awk -F ':' '$3>94 || $7 ~ /bin/' test.txt //匹配第三段大于94的段,或者第7段包含/bin/的段,并都打印出来
yroot:x:95:95:root:/root
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
等等等,只截取了一部分
[root@localhost awk]#
[root@hf-01 awk]# head -n5 test.txt |awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' //在前5行中,匹配第3段大于94的段,或者第七段包含bin的段,然后打印第1,第3,第7段,用 #号 区分
root#0#/bin/bash
bin#1#/sbin/nologin
daemon#2#/sbin/nologin
adm#3#/sbin/nologin
lp#4#/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt //匹配第3段大于第九段的字符,然后打印第1,第3,第7段内容, 并用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NR":"$0}' //在前5行中,打印出所有的行
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
[root@hf-01 awk]#
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NF":"$0}' //在前5行中,打印所有的段
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
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' 'NR<=10' test.txt //打印前十行
rootx: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@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt //匹配前10行中,第1段包含root或者sync的段,并把这一行打印出来
rootx:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,并在第1段包含root或者sync的段,并把这一行打印出来
rootx:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{print $NR":"$NF}' test.txt
rootx:/bin/bash //文件第一行为 rootx 匹配最后一段 /bin/bash
x:/sbin/nologin //文件第二行为 x 匹配最后一段 /sbin/nologin
2:/sbin/nologin //......以此类推下去
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown
:/sbin/halt //因为$NR只有七行,所以在打印后面的时候,行为空
:/sbin/nologin
:/sbin/nologin
等等等,只截取了一部分
[root@hf-01 awk]#
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段赋值为root
root 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段赋值为root,并定义分割符为:
root:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
2847
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中所有包含数字的段,打印出来所在行
rootx: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
等等等,只截取了一部分
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中所有包含数字的段,打印出来所在行
rootx: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
等等等,只截取了一部分
[root@hf-01 awk]#
[root@localhost ~]# cp /etc/passwd /root/test.txt
[root@localhost ~]# ls
111 1.txt 2.txt 3.txt awk sed
123 234 2.txt.bak anaconda-ks.cfg grep test.txt
[root@localhost ~]# sed -n '1,$'p test.txt
[root@localhost ~]# sed -n '3,10'p test.txt
[root@localhost ~]# sed '/root/'p test.txt
[root@localhost ~]# sed '10,$'d test.txt
sed '/nologin/'d test.txt
sed 's/root/toor/'g test.txt
sed 's#/sbin/nologin#/lalala/AAA/#'g test.txt
sed '5,10s/[0-9]//'g test.txt
sed 's/[^0-9a-zA-Z]//'g test.txt
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' test.txt
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
写法一:
sed -r '20,$s/(.*)/aaa:&/'g test.txt
写法二:
sed '20,$s/^.*$/aaa:&/'g test.txt
sed里面的p 是打印, g 是全局替换 d 是删除 -n 参数是要和 p 一起使用
sed '{print $0}' test.txt
sed -F ':' '{print $0}' test.txt
awk '/bash/' test.txt
awk -F ':' '$0 ~ /bash/' test.txt
awk -F ':' '$3=="0"' test.txt
[root@localhost ~]# awk -F ':' '$1=="root"' test.txt |sed 's/root/lll/'
lll:x:0:0:root:/root:/bin/bash
awk -F ':' '{print $NR}' test.txt
[root@localhost ~]# awk -F ':' 'NR>20 {print $0}' test.txt
awk -F ':' '$3<$4 {print $0}' test.txt
awk -F ':' '{print $1"@"$NF}' test.txt
awk -F ':' '{if(sum+=$4)}; END {print sum}' test.txt