awk:入门基础

xiaohai 2021-07-31 21:26:48 3374人围观 标签: Linux 
简介awk不仅仅是Linux系统的一个命令,而且还是一门编程语言,可以用来处理数据和生成报告。处理的数据可以是一个或多个文件,是Linux中最强大的文本处理工具。
说明

  awk不仅仅是Linux系统的一个命令,而且还是一门编程语言,可以用来处理数据和生成报告。处理的数据可以是一个或多个文件,是Linux中最强大的文本处理工具。

格式

awk [option] [pattern|action] file

常用功能
  • 指定分隔符显示某几列:awk -F “GET|HTTP” ‘{print $2}’ access.log直接取出日志文件中url这一列
  • 通过正则表达式取出想要的内容:awk ‘$6~/Failed/{print $11}’ /var/log/secure分析生产环境中的日志找出谁在破解用户的密码
  • 显示某个范围内的内容:awk ‘NR\==20,NR\==30’ access.log 显示文件的20到30行
  • 统计计算:awk ‘{sum+=$0}END{print sum}’ /etc/passwd 计算总和
  • awk数组计算与去重:awk ‘{array[$1]++}END{for(key in array)print key,array[key]}’ access.log对日志文件进行统计与计算
常用命令
  • -F:指定字段分隔符
  • -v:定义成修改一个awk内部的变量
示例

测试文本内容:

[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
nginx:x:1000:1000::/home/nginx:/sbin/nologin
mysql:x:1001:1001::/home/mysql:/sbin/nologin
skip:x:1002:1002::/home/skip:/bin/bash
user_new:x:1003:1003::/home/user_new:/bin/bash
user01:x:1004:1004::/home/user01:/bin/bash
user02:x:1005:1005::/home/user02:/bin/bash
user03:x:1006:1006::/home/user03:/bin/bash
user04:x:1007:1007::/home/user04:/bin/bash
user05:x:1008:1008::/home/user05:/bin/bash
user06:x:1009:1009::/home/user06:/bin/bash
user07:x:1010:1010::/home/user07:/bin/bash
user08:x:1011:1011::/home/user08:/bin/bash
user09:x:1012:1012::/home/user09:/bin/bash
user10:x:1013:1013::/home/user10:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin

1、显示某些行的内容(必须使用两个等号)

[root@localhost ~]# awk "NR==3" /etc/passwd #只显示第三行的内容
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost ~]# awk "NR==3;NR==6" /etc/passwd #只显示第三行或第六行的内容,分号
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

[root@localhost ~]# awk "NR==3,NR==6" /etc/passwd #显示三到六行的内容,逗号
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

2、給文件的每行之前加上行号

[root@localhost ~]# awk '{print NR,$0}' /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 dbus:x:81:81:System message bus:/:/sbin/nologin
15 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
16 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
17 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
20 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
21 nginx:x:1000:1000::/home/nginx:/sbin/nologin
22 mysql:x:1001:1001::/home/mysql:/sbin/nologin
23 skip:x:1002:1002::/home/skip:/bin/bash
24 user_new:x:1003:1003::/home/user_new:/bin/bash
25 user01:x:1004:1004::/home/user01:/bin/bash
26 user02:x:1005:1005::/home/user02:/bin/bash
27 user03:x:1006:1006::/home/user03:/bin/bash
28 user04:x:1007:1007::/home/user04:/bin/bash
29 user05:x:1008:1008::/home/user05:/bin/bash
30 user06:x:1009:1009::/home/user06:/bin/bash
31 user07:x:1010:1010::/home/user07:/bin/bash
32 user08:x:1011:1011::/home/user08:/bin/bash
33 user09:x:1012:1012::/home/user09:/bin/bash
34 user10:x:1013:1013::/home/user10:/bin/bash
35 tcpdump:x:72:72::/:/sbin/nologin

NR表示行号,$0表示一整行的内容

3、显示文件的2到6行的内容,并打印行号

[root@localhost ~]# awk 'NR==2,NR==6 {print NR,$0}' /etc/passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync

4、显示文件的第一列、最后一列

[root@localhost ~]# awk -F ":" '{print $1,$NF}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
avahi /sbin/nologin
avahi-autoipd /sbin/nologin
postfix /sbin/nologin
sshd /sbin/nologin
systemd-network /sbin/nologin
nginx /sbin/nologin
mysql /sbin/nologin
skip /bin/bash
user_new /bin/bash
user01 /bin/bash
user02 /bin/bash
user03 /bin/bash
user04 /bin/bash
user05 /bin/bash
user06 /bin/bash
user07 /bin/bash
user08 /bin/bash
user09 /bin/bash
user10 /bin/bash
tcpdump /sbin/nologin

$NF:表示最后一列

5、把文件中的/bin/bash替换成/bin/nologin

[root@localhost ~]# awk '{gsub("/bin/bash","/sbin/nologin",$0);print $0}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
nginx:x:1000:1000::/home/nginx:/sbin/nologin
mysql:x:1001:1001::/home/mysql:/sbin/nologin
skip:x:1002:1002::/home/skip:/sbin/nologin
user_new:x:1003:1003::/home/user_new:/sbin/nologin
user01:x:1004:1004::/home/user01:/sbin/nologin
user02:x:1005:1005::/home/user02:/sbin/nologin
user03:x:1006:1006::/home/user03:/sbin/nologin
user04:x:1007:1007::/home/user04:/sbin/nologin
user05:x:1008:1008::/home/user05:/sbin/nologin
user06:x:1009:1009::/home/user06:/sbin/nologin
user07:x:1010:1010::/home/user07:/sbin/nologin
user08:x:1011:1011::/home/user08:/sbin/nologin
user09:x:1012:1012::/home/user09:/sbin/nologin
user10:x:1013:1013::/home/user10:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

上面必须先用单引号包裹,里面的替换内容用双引号包裹,以上使用的awk的gsub函数

6、获取网卡的ip地址

[root@localhost ~]# ifconfig eno16777736|awk -F "(inet )|( netmask)" 'NR==2{print $2}'
192.168.71.108
实战1、统计域名的访问次数

日志内容:

[root@localhost ~]# cat access.log 
http://www.baidu.com/index.html
http://www.taobao.com/index.html
http://www.hi917.com/index.html
http://www.hi917.com/detail.html
http://www.baidu.com/search.html
http://www.hi917.com/other.html

方案1、传统的方法

[root@localhost ~]# awk -F "/" '{print $3}' access.log  #使用/进行分割
www.baidu.com
www.taobao.com
www.hi917.com
www.hi917.com
www.baidu.com
www.hi917.com
[root@localhost ~]# awk -F "/" '{print $3}' access.log |sort  #把相同的域名排序在一起
www.baidu.com
www.baidu.com
www.hi917.com
www.hi917.com
www.hi917.com
www.taobao.com
[root@localhost ~]# awk -F "/" '{print $3}' access.log |sort |uniq -c #去重计数
      2 www.baidu.com
      3 www.hi917.com
      1 www.taobao.com

方案2、使用数组

[root@localhost ~]# awk -F "/" '{list[$3]++}END{for(domain in list)print domain,list[domain]}' access.log 
www.taobao.com 1
www.baidu.com 2
www.hi917.com 3