linux 学习笔记-028-awk

发布于 2018-01-30  302 次阅读


awk

准备工作:

[root@am-01:~#] mkdir awk

[root@am-01:~#] cp /etc/passwd awk/test.txt

[root@am-01:~#] cd awk/

[root@am-01:~/awk#] ls

test.txt

以冒号:为分隔符打印第一段(-F 指定分隔符,不会更改文件内容)

[root@am-01:~/awk#] head test.txt | awk -F ':' '{print $1}'

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

operator

awk 打印所有的段

[root@am-01:~/awk#] head test.txt | awk '{print $0}'

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

不用-F 指定分隔符的情况下,默认会以空格或空白字符为分隔符

[root@am-01:~/awk#] vim 1.txt

1 2

aa bb

cc ee

[root@am-01:~/awk#] head 1.txt | awk '{print $1}'

1

aa

cc

以冒号:为分隔符打印指定段

[root@am-01:~/awk#] head test.txt | awk -F ':' '{print $1,$3,$7}'

root 0 /bin/bash

bin 1 /sbin/nologin

daemon 2 /sbin/nologin

adm 3 /sbin/nologin

lp 4 /sbin/nologin

sync 5 /bin/sync

shutdown 6 /sbin/shutdown

halt 7 /sbin/halt

mail 8 /sbin/nologin

operator 11 /sbin/nologin

以冒号:为分隔符打印指定段,并以指定符号分割

[root@am-01:~/awk#] head test.txt | awk -F ':' '{print $1"*"$3"*"$7}'

root*0*/bin/bash

bin*1*/sbin/nologin

daemon*2*/sbin/nologin

adm*3*/sbin/nologin

lp*4*/sbin/nologin

sync*5*/bin/sync

shutdown*6*/sbin/shutdown

halt*7*/sbin/halt

mail*8*/sbin/nologin

operator*11*/sbin/nologin

打印包含指定字符的行

[root@am-01:~/awk#] head test.txt | awk '/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

匹配第一段包含字符 oo 的行

[root@am-01:~/awk#] head test.txt | awk -F ':' '$1 ~ /oo/'

root:x:0:0:root:/root:/bin/bash

只要+号左边有 1 个或多个 o 的都匹配出来

[root@am-01:~/awk#] head test.txt | awk -F ':' '/o+/'

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

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

多个表达式一起写

[root@am-01:~/awk#] head 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

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@am-01:~/awk#] head test.txt | awk -F ':' '/root/ {print $1,$4} /halt/ {print $2,$6}'

root 0

x /sbin

operator 0

匹配包含 root 和 mail 的行并打印出来

[root@am-01:~/awk#] head test.txt | awk -F ':' '/root|mail/ {print $0}'

root:x:0:0:root:/root:/bin/bash

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

匹配第三列为 0 的行,并把这一行的第一列打印出来

[root@am-01:~/awk#] awk -F ':' '$3==0 {print $1}' test.txt

root

匹配第三列大于等于 10 的行,并把这一行的第一列打印出来

[root@am-01:~/awk#] awk -F ':' '$3>=0 {print $1}' test.txt | head

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

operator

以 ASCII 表匹配(加双引号,注意加双引号和不加双引号的区别)

[root@am-01:~/awk#] awk -F ':' '$3>=10 {print $0}' test.txt | head

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

avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

polkitd:x:999:998:User for polkitd:/:/sbin/nologin

tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

[root@am-01:~/awk#] awk -F ':' '$3>="10" {print $0}' test.txt | head

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

匹配第七段不等于/sbin/nologoin,!=为不等于,匹配字符串要加双引号

[root@am-01:~/awk#] awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt | head

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

aming:x:1000:1000::/home/aming:/bin/bash

user1:x:1001:1001::/home/user1:/bin/bash

user2:x:1002:1002::/home/user2:/bin/bash

user3:x:1003:1005::/home/user3:/bin/bash

user5:x:1005:1006::/home/user5:/bin/bash

user6:x:1007:1007::/home/user6:/bin/bash

匹配第三段比第四段小的行

[root@am-01:~/awk#] awk -F ':' '$3<$4' test.txt | head

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

user3:x:1003:1005::/home/user3:/bin/bash

user4:x:1004:1005::/home/aming111:/sbin/nologin

user5:x:1005:1006::/home/user5:/bin/bash

匹配第三段等于第四段的行

[root@am-01:~/awk#] awk -F ':' '$3==$4' test.txt | head

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

avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

aming:x:1000:1000::/home/aming:/bin/bash

匹配第三段大于 4 但小于 7 的行,加双引号则会按照 ASCII 表匹配

[root@am-01:~/awk#] awk -F ':' '$3>4 && $3<7' test.txt | head

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

[root@am-01:~/awk#] awk -F ':' '$3>"4" && $3<"7"' test.txt | head

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

匹配第三段大于 1000 或者第七段是/sbin/nologin

[root@am-01:~/awk#] awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt | head

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

avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

匹配第三段大于 1000 或第七段为/bash/的行

[root@am-01:~/awk#] awk -F ':' '$3>1000 || $7 ~ /bash/' test.txt | head

root:x:0:0:root:/root:/bin/bash

aming:x:1000:1000::/home/aming:/bin/bash

user1:x:1001:1001::/home/user1:/bin/bash

user2:x:1002:1002::/home/user2:/bin/bash

user3:x:1003:1005::/home/user3:/bin/bash

user4:x:1004:1005::/home/aming111:/sbin/nologin

user5:x:1005:1006::/home/user5:/bin/bash

user6:x:1007:1007::/home/user6:/bin/bash

匹配第三段大于 1000 或第七段为/bash/的行,并把 1/3/7 列以#号为分隔符打印出来

[root@am-01:~/awk#] awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' test.txt | head

root#0#/bin/bash

aming#1000#/bin/bash

user1#1001#/bin/bash

user2#1002#/bin/bash

user3#1003#/bin/bash

user4#1004#/sbin/nologin

user5#1005#/bin/bash

user6#1007#/bin/bash

匹配$3 大于 1000 的行并把 1-4 行以#号为分隔符打印出来

[root@am-01:~/awk#] awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt | headuser1#x#1001#1001

user2#x#1002#1002

user3#x#1003#1005

user4#x#1004#1005

user5#x#1005#1006

user6#x#1007#1007

NR 表示行,NF 表示段

匹配出来的时候加上行号

[root@am-01:~/awk#] awk -F ':' '{print NR":"$0}' test.txt | head

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

匹配出来的时候加上段号

[root@am-01:~/awk#] awk -F ':' '{print NF":"$0}' test.txt | head

7:root:x: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

匹配行号小于等于 10 且第一段为 root 或者 sync 的行,如果是段号 NF 同理

[root@am-01:~/awk#] awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt | head

root:x:0:0:root:/root:/bin/bash

sync:x:5:0:sync:/sbin:/bin/sync

匹配$NR:$NF,和源文件对比可看出区别

解析:$1:$7,$2:$7,$3:$7~~以此类推

[root@am-01:~/awk#] cat test.txt | head

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@am-01:~/awk#] awk -F ':' '{print $NR":"$NF}' test.txt | head

root:/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

和 head 结合,把第一段赋值为 root,定义分隔符,最后打印出来

[root@am-01:~/awk#] head -n 5 test.txt | 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

root:x:3:4:adm:/var/adm:/sbin/nologin

root:x:4:7:lp:/var/spool/lpd:/sbin/nologin

tot 值加第三段的值,最后打出总和,tot 的值一开始没定义,即为零

[root@am-01:~/awk#] awk -F ':' '{(tot=tot+$3)}; END{print tot}' test.txt

8704

参考教程

http://www.cnblogs.com/emanlee/p/3327576.html