第 A-1 章 Awk Examples
该章节作为 Awk 语法解析的补充章节,主要演示一下常用的一些示例;
A1、awk 插入几个新字段
在 "a b c d" 的 b 后面插入 3 个字段 e f g
。
[root@arm64v8 ~]# echo a b c d|awk '{$3="e f g "$3;print}'
a b e f g c d
[root@arm64v8 ~]#
A2、awk 格式化空白
移除每行的前缀、后缀空白,并将各部分左对齐。
[root@arm64v8 ~]# cat a.txt
aaaa bbb ccc
bbb aaa ccc
ddd fff eee gg hh ii jj
[root@arm64v8 ~]#
[root@arm64v8 ~]# awk 'BEGIN{OFS="\t"}{$1=$1;print}' a.txt
aaaa bbb ccc
bbb aaa ccc
ddd fff eee gg hh ii jj
[root@arm64v8 ~]#
A3、awk 筛选 IPv4 地址
从 ifconfig 命令的结果中筛选出除了 lo 网卡外的所有 IPv4 地址。
[root@arm64v8 ~]# ifconfig | awk '/inet / && !($2 ~ /^127/){print $2}'
10.51.111.142
[root@arm64v8 ~]#
A4、awk 读取 .ini 配置文件中的某段
[base]
name=os_repo
baseurl=https://xxx/centos/$releasever/os/$basearch
gpgcheck=0
enable=1
[mysql]
name=mysql_repo
baseurl=https://xxx/mysql-repo/yum/mysql-5.7-community/el/$releasever/$basearch
gpgcheck=0
enable=1
[epel]
name=epel_repo
baseurl=https://xxx/epel/$releasever/$basearch
gpgcheck=0
enable=1
[percona]
name=percona_repo
baseurl = https://xxx/percona/release/$releasever/RPMS/$basearch
enabled = 1
gpgcheck = 0
--------------------------------------------------------------------------------
[root@arm64v8 ~]# awk '
> BEGIN{RS=""}
> /\[mysql\]/{
> print;
> while ((getline)>0){
> if(/\[.*\]/){
> exit
> }
> print
> }
> }' a.txt
[mysql]
name=mysql_repo
baseurl=https://xxx/mysql-repo/yum/mysql-5.7-community/el/$releasever/$basearch
gpgcheck=0
enable=1
[root@arm64v8 ~]#
A5、awk 根据某字段去重
去掉 uid=xxx
重复的行。
[root@arm64v8 ~]# cat a.txt
2019-01-13_12:00_index?uid=123
2019-01-13_13:00_index?uid=123
2019-01-13_14:00_index?uid=333
2019-01-13_15:00_index?uid=9710
2019-01-14_12:00_index?uid=123
2019-01-14_13:00_index?uid=123
2019-01-15_14:00_index?uid=333
2019-01-16_15:00_index?uid=9710
[root@arm64v8 ~]#
[root@arm64v8 ~]# awk -F"?" '!arr[$2]++{print}' a.txt
2019-01-13_12:00_index?uid=123
2019-01-13_14:00_index?uid=333
2019-01-13_15:00_index?uid=9710
[root@arm64v8 ~]#
A6、awk 次数统计
[root@arm64v8 ~]# cat a.txt
portmapper
portmapper
portmapper
portmapper
portmapper
portmapper
status
status
mountd
mountd
mountd
mountd
mountd
mountd
nfs
nfs
nfs_acl
nfs
nfs
nfs_acl
nlockmgr
nlockmgr
nlockmgr
nlockmgr
nlockmgr
[root@arm64v8 ~]# awk '{arr[$1]++}END{OFS="\t"; for(idx in arr){print arr[idx],idx}}' a.txt
4 nfs
2 status
5 nlockmgr
6 portmapper
2 nfs_acl
6 mountd
[root@arm64v8 ~]#
A7、awk 统计 TCP 连接状态数量
[root@arm64v8 ~]# netstat -tnap | awk '
/^tcp/{
arr[$6]++
}
END{
for(state in arr){
print state ": " arr[state]
}
}
'
LISTEN: 10
ESTABLISHED: 1
[root@arm64v8 ~]#
A8、awk 统计日志中各 IP 访问非 200 状态码的次数
[root@arm64v8 ~]# cat a.txt
111.202.100.141 - - [2019-11-07T03:11:02+08:00] "GET /robots.txt HTTP/1.1" 301 169
[root@arm64v8 ~]# awk '$8!=200{arr[$1]++}END{for(i in arr){print arr[i],i}}' a.txt | sort -k1nr | head -n 10
1 111.202.100.141
[root@arm64v8 ~]#
A9、awk 统计独立 IP
url 访问 IP 访问时间访问人
[root@arm64v8 ~]# cat a.txt
a.com.cn|202.109.134.23|2015-11-20 20:34:43|guest
b.com.cn|202.109.134.23|2015-11-20 20:34:48|guest
c.com.cn|202.109.134.24|2015-11-20 20:34:48|guest
a.com.cn|202.109.134.23|2015-11-20 20:34:43|guest
a.com.cn|202.109.134.24|2015-11-20 20:34:43|guest
b.com.cn|202.109.134.25|2015-11-20 20:34:48|guest
[root@arm64v8 ~]#
[root@arm64v8 ~]# awk '
BEGIN{
FS="|"
}
!arr[$1,$2]++{
arr1[$1]++
}
END{
for(i in arr1){
print i,arr1[i]
}
}' a.txt
a.com.cn 2
c.com.cn 1
b.com.cn 2
[root@arm64v8 ~]#