点击了解更多技术资料和免费学习视频,请加入讨论群:662736393
欢迎关注百哥IT技术专栏,联系QQ:3473067134
什么是awk
awk是Linux文本处理三剑客之一,在grep,sed,awk中,awk功能最为强大,使用最为灵活,因为其本身也属于一种编程语言,可以通过编程实现各种需要的文本处理需求。
当然,awk使用也较为复杂,这里用直观的例子来介绍awk的日常使用。
案例一:通过awk取得服务器的ip地址和掩码,并按自己想要的格式输出(假设希望让ip地址和掩码之间用---相连)
步骤1:
[root@centos8 ~]# ifconfig ens33 | awk 'NR==2{print}'
inet 192.168.0.208 netmask 255.255.255.0 broadcast 192.168.0.255
说明:awk 'NR==2{print}'是打印第二行的意思,相当于sed –n 2p,当然这里使用sed更加方便,只是为了说明awk的用法
步骤2:
[root@centos8 ~]# ifconfig ens33 | awk 'NR==2{print}' | awk '{print $2}'
192.168.0.208
说明:awk '{print $2}'是打印第二列的意思,awk默认以空格作为分隔符,这里的第二列就是ip地址了,同样awk '{print $2,$4}'可以得到ip加掩码
[root@centos8 ~]# ifconfig ens33 | awk 'NR==2{print}' | awk '{print $2,$4}'
192.168.0.208 255.255.255.0
步骤3:
ifconfig ens33 | awk 'NR==2{print}' | awk 'BEGIN {OFS="---"} {print $2,$4}'
192.168.0.208---255.255.255.0
说明:这里的BEGIN{}是对awk的默认参数进行设置,OFS是awk输出信息的默认分隔符,这里="---"就是把输出分隔符设置为---
案例二:获得httpd服务的端口号
步骤1:
[root@centos8 ~]# netstat -nltp | awk '/httpd/'
tcp6 0 0 :::8080 :::* LISTEN 1505/httpd
说明:awk '/httpd/'相当于grep httpd,获得包含httpd的一行
步骤2:
[root@centos8 ~]# netstat -nltp | awk '/httpd/ {print $4}'
:::8080
说明:打印包含httpd的行的第4列
步骤3:
[root@centos8 ~]# netstat -nltp | awk '/httpd/ {print $4}' | grep -o [0-9]*
8080
说明:grep –o是指显示过滤出的数据,只留下数字,其他的不要,星代表可以匹配多位数字。
案例三:统计出/etc/目录下所有conf结尾的文件的总大小
步骤1:列出相关文件
[root@centos8 etc]# ls -l *.conf
-rw-r--r--. 1 root root 1085 May 10 2019 chrony.conf
-rw-r--r--. 1 root root 117 Nov 9 01:10 dracut.conf
-rw-r--r--. 1 root root 38 May 11 2019 fuse.conf
-rw-r--r--. 1 root root 9 Sep 10 2018 host.conf
-rw-r--r--. 1 root root 4849 Nov 9 04:56 idmapd.conf
-rw-r--r--. 1 root root 7916 Mar 29 11:30 kdump.conf
省略。。。
步骤2:使用awk抓取第5列并进行相加,然后打印出来
[root@centos8 etc]# ls -l *.conf |awk 'BEGIN {size=0;} {size=size+$5;} END{print "文件总大小是"size"字节"}'
文件总大小是41985字节
说明:
{size=0;} {size=size+$5;},因为awk本身支持编程,这里则是定义了一个变量size,然后size则是对第5列的累加。
{print "文件总大小是"size"字节"}' 这里双引号里的内容是自己加的,size是经过计算后的变量结果。