• Linux三剑客之awk命令


    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块也可不同时出现。
  • 相关阅读:
    Java面试——从JVM角度比较equals和==的区别
    Java线程和多线程(三)——线程安全和同步
    玩转Android之MVVM开发模式实战,炫酷的DataBinding!
    写点什么好呢2? 钱、事业、婚姻、人生意义
    写点什么好呢2? 钱、事业、婚姻、人生意义
    大型网站架构技术一览
    【树莓派】GSM900模块
    【Latex】数学公式排版
    【MYSQL】导入中文后乱码问题
    【R】shiny界面
  • 原文地址:https://www.cnblogs.com/hwli/p/11258473.html
Copyright © 2020-2023  润新知