博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux三剑客之awk命令

Posted on 2019-07-28 12:37  (︶O︶)  阅读(232)  评论(0编辑  收藏  举报

awk的格式

  • awk指令是由模式,动作,或者模式和动作的组合组成。
  • 模式既pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把他理解为一个条件。
  • 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。比如awk使用格式:

options:设置的命令参数。

-F:设置字段分隔符,默认以空格为分隔符。可设置多个分隔符,如-F '[:/]+'设置一个或多个:或/为分隔符

pattern:条件。如NR==1

NR:Number Of Record,正在处理的行号。

RS:Record Separator,输入输出数据记录分隔符,每行之间的分隔符,默认为\n。

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块也可不同时出现。