awk的格式
- awk指令是由模式,动作,或者模式和动作的组合组成。
- 模式既pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把他理解为一个条件。
- 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。比如awk使用格式:
options:设置的命令参数。
-F:设置字段分隔符,默认以空格为分隔符。可设置多个分隔符,如-F '[:/]+'设置一个或多个:或/为分隔符
pattern:条件。如NR==1
NR:Number Of Record,正在处理的行号。
RS:Record Separator,输入输出数据记录分隔符,每行之间的分隔符,默认为 。
NF:当前行号的最后一列,也就是当前行号的列数,如果将某行分为7列,则NF为7,$NF为当前行的第7列数据。
action:执行的动作。如print $1
0 root@PC:~# cat test.txt 1 root:x:0:0:root:/root:/bin/bash 2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 3 bin:x:2:2:bin:/bin:/usr/sbin/nologin 4 sys:x:3:3:sys:/dev:/usr/sbin/nologin 5 sync:x:4:65534:sync:/bin:/bin/sync 6 games:x:5:60:games:/usr/games:/usr/sbin/nologin 7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin 8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin 9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologin 10 systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
1 root@PC:~# awk -F ":" 'NR>5&&NR<8{print $1,$3}' test.txt 2 games 5 3 man 6 4 -F:设置字段分隔符为:默认为空格 5 NR:Number Of Record行号 6 printf $1,$3,输出第1字段和第3字段
1 root@PC:~# awk -F ":" 'NR==3{print $NF}' test.txt 2 /usr/sbin/nologin
将字段分隔符设置为":",第3行,第1列bin,第2列x,第3列2,第4列2,第5列bin,第6列/bin,第7列/usr/sbin/nologin,$NF为最后一列
1 root@PC:~# awk -F ":" 'NR==2{print NR,$1} NR==3{print NR,$NF}' test.txt 2 2 daemon 3 3 /usr/sbin/nologin
将字段分隔符设置为":",当第2行时,输出当前行号和第1列的值,当第3行时,输出当前行号和最后一列的值。其中有两个pattern和action,每个action跟在相对应得pattern后面。
1 root@PC:~# awk -F '[:/]' 'NR>3&&NR<8{print $7}' test.txt 2 dev 3 bin 4 usr 5 var 6 root@PC:~# awk -F ':' 'NR>3&&NR<8{print $7}' test.txt 7 /usr/sbin/nologin 8 /bin/sync 9 /usr/sbin/nologin 10 /usr/sbin/nologin
1 root@PC:~# ll 2 total 28 3 drwx------ 3 root root 4096 Jul 28 12:08 ./ 4 drwxr-xr-x 24 root root 4096 May 20 22:59 ../ 5 -rw-r--r-- 1 root root 3106 Oct 23 2015 .bashrc 6 drwx------ 2 root root 4096 Jul 20 2016 .cache/ 7 -rw------- 1 root root 32 Jul 28 12:08 .lesshst 8 -rw-r--r-- 1 root root 148 Aug 17 2015 .profile 9 -rw-r--r-- 1 root root 460 Jul 28 11:44 test.txt 10 root@PC:~# ll|awk 'BEGIN{size=0;} {size+=$5;} END{print "size",size,"B"}' 11 size 16034 B
使用ll将目录中详细信息输出,其中第5列是子目录的大小,awk中BEGIN块,一般作为初始化变量,中间为其他执行过程,END块为最后结果,当然也可去除BEGIN和END块,BEGIN块和END块也可不同时出现。