[ Linux ] 详解 awk 命令

0x00 简介

awk 命令,即著名的三剑客指令,取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的姓氏首字母作为命名,是一款十分强大的文本分析工具。实际上,awk本身有自己的语言: AWK 程序设计语言,是一种 " 样式扫描和处理语言 " ,可应用于各种计算和数据处理任务。通常,awk是以文件的一行为处理单位的。
usage: awk '{pattern + action}' {filenames}
其中, pattern 表示 AWK 在数据中查找的内容,可以为正则表达式; 而 action 是在找到匹配内容时所执行的一系列命令。
awk 在 linux 中有三种调用方式,分别为命令行方式:

awk [-F 可选的域分隔符] ‘commands’ [带处理文件]

awk脚本方式:

awk [-f script] [file]

shell脚本方式:

#!/bin/awk 
#使用 awk 解释器执行该脚本

0x01 基本使用

打开一个 shell 窗口,使用命令行方式调用 awk 完成工作:
实例1:
通过管道符与 awk 结合 netstat 命令查看与本机通信的 ip 地址:

root@inv@1id:~# netstat -pantu 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      639/sshd            
tcp        0      0 172.16.12.52:34148      203.208.39.249:443      TIME_WAIT   -                   
tcp        0      0 172.16.12.52:39278      203.208.43.122:443      ESTABLISHED 1898/firefox-esr    
tcp        0      0 172.16.12.52:58494      47.95.47.253:443        ESTABLISHED 1898/firefox-esr    
tcp        0      0 172.16.12.52:52434      120.92.150.127:7823     ESTABLISHED 1898/firefox-esr    
tcp        0      0 172.16.12.52:60784      202.89.233.101:443      ESTABLISHED 1898/firefox-esr    
tcp        0      0 172.16.12.52:56686      115.223.14.213:443      ESTABLISHED 1898/firefox-esr    
tcp6       0      0 :::22                   :::*                    LISTEN      639/sshd            
udp        0      0 0.0.0.0:68              0.0.0.0:*                           3238/dhclient       

先把tcp|udp开头的筛选出来:

root@inv@1id:~# netstat -pantu | awk '/^(tcp|udp)/{print $5}'
0.0.0.0:*
203.208.43.122:443
47.95.47.253:443
120.92.150.127:7823
202.89.233.101:443
115.223.14.213:443
:::*
0.0.0.0:*

再删去0.0.0.0 或 :::

root@inv@1id:~# netstat -pantu | awk '/^(tcp|udp)/{print $5}' | awk '/^[1-9][\d]*?/'
47.95.47.253:443
120.92.150.127:7823
115.223.14.213:443

最后再把端口号去掉:

root@inv@1id:~# netstat -pantu | awk '/^(tcp|udp)/{print $5}' | awk '/[1-9][\d]*?/' | awk -F: '{print $1}'
47.95.47.253
120.92.150.127
115.223.14.213

-F参数后紧跟域分隔符,(缺省值为空格)
可见,我们在筛选时只使用awk就可以完成cut、grep等命令组合才能完成的功能;
(注: 上述案例中最后得到的结果明显少于第一次执行netstat的结果,只是因为在筛选的过程中我的计算机关闭了某些连接,命令是正确的)

----------------------------------------------------------------------------------------------------------------------------------------------------

实例2: 使用 -v 参数设置变量:
# awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
2 3 2s
3 4 3s
This's 1 This'ss
10 11 10s

0x02 内置变量

awk有许多内置变量用来设置环境信息:

ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数

。。。
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域。。。

0x03 数组

awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)
实例:

# awk -F: 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
6 man
...

----------------------------------------------------------------------------------------------------------------------------------------------------

总而言之,awk 是一款非常强大的文本分析工具,希望大家能从中受益;

----------------------------------------------------------------------------------------------------------------------------------------------------

参考:
https://www.runoob.com/linux/linux-comm-awk.html
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值