美文网首页操作系统Linux.命令Linux
awk命令基本用法(一)

awk命令基本用法(一)

作者: 一个小运维 | 来源:发表于2021-06-28 19:16 被阅读0次

    一:awk文本过滤的基本用法

    1)基本操作方法

    格式:awk [选项] '[条件]{指令}' 文件
    

    其中,print 是最常用的编辑指令;多条编辑指令,用分号分隔;
    Awk过滤数据时支持仅打印某一列,如第2列、第5列等;
    处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符;
    直接过滤文件内容:

    [root@svr5 ~]# cat test.txt 
    hello the world
    welcome to beijing
    [root@svr5 ~]# awk '{print $1,$3}' test.txt        //打印文档第1列和第3列
    hello world
    welcome beijing
    

    结合管道过滤命令输出:

    [root@svr5 ~]# df -h | awk '{print $4}'        //打印磁盘的剩余空间
    

    2)选项 -F 可指定分隔符

    输出passwd文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开,操作如下:

    [root@svr5 ~]# awk -F: '{print $1,$7}' /etc/passwd
    root /bin/bash
    bin /sbin/nologin
    daemon /sbin/nologin
    adm /sbin/nologin
    … …
    

    awk还识别多种单个的字符,比如以“:”或“/”分隔,输出第1、10个字段:

    [root@svr5 ~]# awk -F [:/] '{print $1,$10}' /etc/passwd
    root bash
    bin nologin
    daemon nologin
    adm sbin
    … …
    
    awk常用内置变量:
    $0 文本当前行的全部内容
    $1 文本的第1列
    $2 文件的第2列
    $3 文件的第3列,依此类推
    NR 文件当前行的行号
    NF 文件当前行的列数(有几列)
    

    输出每次处理行的行号,以及当前行以“:”分隔的字段个数(有几列):

    [root@svr5 ~]# awk -F: '{print NR,NF}' passwd.txt
    1 7
    2 7
    3 7
    .. ..
    

    2)awk的print指令不仅可以打印变量,还可以打印常量

    [root@svr5 ~]# awk -F: '{print $1,"的解释器:",$7}' /etc/passwd
    root 的解释器: /bin/bash
    bin 的解释器: /sbin/nologin
    … …
    
    

    二:利用awk提取本机的网络流量、根分区剩余容量、获取远程失败的IP地址

    1)提取IP地址

    分步实现的思路及操作参考如下——

    通过ifconfig eth0查看网卡信息,其中包括网卡流量:

    [root@svr5 ~]# ifconfig eth0
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.4.21  netmask 255.255.255.0  broadcast 192.168.4.255
    inet6 fe80::fa64:c143:ad6a:5159  prefixlen 64  scopeid 0x20<link>
    ether 52:54:00:b3:11:11  txqueuelen 1000  (Ethernet)
    RX packets 313982  bytes 319665556 (304.8 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 51809  bytes 40788621 (38.8 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    RX为接收的数据量,TX为发送的数据量。packets以数据包的数量为单位,bytes以字节为单位:

    [root@svr5 ~]# ifconfig eth0 | awk '/RX p/{print $5}'    //过滤接收数据的流量
    319663094
    [root@svr5 ~]# ifconfig eth0 | awk '/TX p/{print $5}'     //过滤发送数据的流量
    40791683
    

    2)提取根分区剩余容量

    分步实现的思路及操作参考如下——

    通过df命令查看根分区的使用情况,其中包括剩余容量:

    [root@svr5 ~]# df -h /
    文件系统             容量     已用     可用     已用%     挂载点
    /dev/sda2         19G         7.2G     11G         40%         /
    

    输出上述结果中最后一行的第4列:

    [root@svr5 ~]# df -h / | tail -1 | awk '{print $4}'
    11G
    

    或者直接在awk中使用正则:

    [root@svr5 ~]# df -h | awk '/\/$/{print $4}'
    11G
    

    3)根据/var/log/secure日志文件,过滤远程连接密码失败的IP地址

    [root@svr5 ~]# awk '/Failed/{print $11}' /var/log/secure
    192.168.2.254
    192.168.2.100
    ... ...
    

    三:格式化输出/etc/passwd文件

    1)awk处理的时机

    awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性质的工作。在命令格式上分别体现如下:

    awk  [选项]  '[条件]{指令}'  文件
    awk  [选项]  ' BEGIN{指令} {指令} END{指令}'  文件
    
    • BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次
    • { } 逐行处理,读取文件过程中执行,指令执行n次
    • END{ } 行后处理,读取文件结束后执行,指令执行1次

    只做预处理的时候,可以没有操作文件,比如:

    [root@svr5 ~]# awk 'BEGIN{A=24;print A*2}'
    [root@svr5 ~]# awk 'BEGIN{print x+1}'           #x可以不定义,直接用,默认值位0
    [root@svr5 ~]# awk 'BEGIN{print 3.2+3.5}'
    

    举个例子(统计系统中使用bash作为登录Shell的用户总个数):

    a.预处理时赋值变量x=0
    b.然后逐行读入/etc/passwd文件,如果发现登录Shell是/bin/bash则x加1
    c.全部处理完毕后,输出x的值即可。相关操作及结果如下:

    [root@svr5 ~]# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd
    29
    

    2)格式化输出/etc/passwd文件

    要求: 格式化输出passwd文件内容时,要求第一行为列表标题,中间打印用户的名称、UID、家目录信息,最后一行提示一共已处理文本的总行数,如图-1所示。

    image

    3)根据实现思路编写、验证awk过滤语句

    输出信息时,可以使用“\t”显示Tab制表位:

    [root@svr5 ~]# awk -F: 'BEGIN{print "User\tUID\tHome"} \
    {print $1 "\t"  $3  "\t"  $6}     \
    END{print "Total",NR,"lines."}' /etc/passwd
    User    UID     Home
    root    0  /root
    bin     1  /bin
    daemon  2  /sbin
    adm     3  /var/adm
    lp      4  /var/spool/lpd
    sync    5  /sbin
    .. ..
    Total 67 lines.
    

    相关文章

      网友评论

        本文标题:awk命令基本用法(一)

        本文链接:https://www.haomeiwen.com/subject/ymhwyltx.html