awk是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK,awk是一个行级文本高效处理工具,awk经过改进生成的新的版本有nawk、gawk,一般Linux默认为gawk,gawk是awk的GNU开源免费版本。
awk基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行
awk 'pattern + {action}' file
1.awk基本语法参数详解:
-->单引号' '是为了和shell命令区分开
-->大括号{ }表示一个命令分组
-->pattern是一个过滤器,表示匹配pattern条件的行才进行Action处理
-->action是处理动作,常见动作为Print
-->使用#作为注释,pattern和action可以只有其一,但不能两者都没有
2.awk内置变量详解:
-->FS 分隔符,默认是空格
-->OFS 输出分隔符
-->NR 当前行数,从1开始
-->NF 当前记录字段个数
-->$0 当前记录
-->$1~$n 当前记录第n个字段(列)
3.awk内置函数详解:
-->gsub(r,s):在$0中用s代替r
-->index(s,t):返回s中t的第一个位置
-->length(s):s的长度
-->match(s,r):s是否匹配r
-->split(s,a,fs):在fs上将s分成序列a
-->substr(s,p):返回s从p开始的子串
4.awk常用操作符,运算符及判断符:
-->++ -- 增加与减少( 前置或后置)
-->^ ** 指数( 右结合性)
-->! + - 非、一元(unary) 加号、一元减号
-->+ - * / % 加、减、乘、除、余数
-->< <= == != > >= 数字比较
-->&& 逻辑and
-->|| 逻辑or
-->= += -= *= /= %= ^= **= 赋值
5.awk与流程控制语句:
-->if(condition) { } else { }
-->while { }
-->do{ }while(condition)
-->for(init;condition;step){ }
-->break/continue
命令:
df -h | awk -F' ' '{print $1}'
[root@rhel77 ~]# df -h | awk -F' ' '{print $1}'
Filesystem
devtmpfs
tmpfs
tmpfs
tmpfs
/dev/sda6
/dev/sda3
/dev/sda1
/dev/sr0
/dev/mapper/data_vg-data_lv
/dev/mapper/rhel_rhel77-var
tmpfs
[root@rhel77 ~]#
命令:
awk -F '[ :;\t]' '{print $1}' ztj.txt
[root@rhel77 ~]# cat ztj.txt
ztj 123 1000
tom:10 1200
cat 89 1300
lisi;90 3000
wangwu 2 5000
zhaoliu 2 5000
zhaoliu 2 5000
[root@rhel77 ~]# awk -F '[ :;\t]' '{print $1}' ztj.txt
ztj
tom
cat
lisi
wangwu
zhaoliu
zhaoliu
[root@rhel77 ~]#
命令:
awk -F: '{print $1 >> "/tmp/awk.log"}' ztj.txt
[root@rhel77 ~]# cat ztj.txt
ztj 123 1000
tom:10 1200
cat 89 1300
lisi;90 3000
wangwu 2 5000
zhaoliu 2 5000
zhaoliu 2 5000
[root@rhel77 ~]# awk -F: '{print $1 >> "/tmp/awk.log"}' ztj.txt
[root@rhel77 ~]# cat /tmp/awk.log
ztj 123 1000
tom
cat 89 1300
lisi;90 3000
wangwu 2 5000
zhaoliu 2 5000
zhaoliu 2 5000
[root@rhel77 ~]#
命令:
awk 'NR==3,NR==5 {print}' ztj.txt
awk 'NR==3,NR==5 {print $0}' ztj.txt
NR表示打印行,$0表示文本所有域
[root@rhel77 ~]# cat ztj.txt
ztj 123 1000
tom:10 1200
cat 89 1300
lisi;90 3000
wangwu 2 5000
zhaoliu 2 5000
zhaoliu 2 5000
[root@rhel77 ~]# awk 'NR==3,NR==5 {print}' ztj.txt
cat 89 1300
lisi;90 3000
wangwu 2 5000
[root@rhel77 ~]# awk 'NR==3,NR==5 {print $0}' ztj.txt
cat 89 1300
lisi;90 3000
wangwu 2 5000
[root@rhel77 ~]#
命令:
awk 'length($0)>80 {print NR}' ztj.txt
[root@rhel77 ~]# cat ztj.txt
ztj 123 1000
tom:10 1200
cat 89 1300
lisi;90 3000
wangwu 2 5000
zhaoliu 2 5000
zhaoliu 2 5000
123456789011111111111111111111111111111111111111111111111111111111111111111111111
[root@rhel77 ~]# awk 'length($0)>80 {print NR}' ztj.txt
8
[root@rhel77 ~]#
命令:
awk -F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd
cat /etc/passwd | head -n 5 | awk -F: '{print $1}'
[root@rhel77 ~]# awk -F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd
root
bin
daemon
adm
lp
[root@rhel77 ~]# cat /etc/passwd | head -n 5 | awk -F: '{print $1}'
root
bin
daemon
adm
lp
[root@rhel77 ~]#
命令:
cat ztj.txt | awk '{sum+=$2}END{print sum}'
[root@rhel77 ~]# cat ztj.txt
ztj 123 1000
tom 10 1200
cat 89 1300
lisi 90 3000
wangwu 2 5000
zhaoliu 2 5000
zhaoliu 2 5000
[root@rhel77 ~]# cat ztj.txt | awk '{sum+=$2}END{print sum}'
318
[root@rhel77 ~]#
命令:
awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd
[root@rhel77 ~]# awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd
1 root
3 daemon
5 lp
7 shutdown
9 mail
11 games
13 nobody
15 dbus
17 sshd
19 chrony
21 geoclue
23 apache
25 mailnull
27 aa
29 rpc
31 unbound
33 gluster
35 colord
37 saned
39 gdm
41 rpcuser
43 abrt
45 tcpdump
47 ntp
49 xxxx
51 zz
53 pro2
55 alice
57 tomcat
59 mysql
[root@rhel77 ~]#
命令:
ifconfig ens33|grep "inet"|awk '{print "ip_"$2}'
[root@rhel77 ~]# ifconfig ens33|grep "inet"|awk '{print "ip_"$2}'
ip_192.168.10.213
ip_fe80::fab1:2705:b2c9:676d
[root@rhel77 ~]#
命令:
echo 3 2 1 | awk '{ if(($1>$2)||($1>$3)) { print $2} else {print $1} }'
[root@rhel77 ~]# echo 3 2 1 | awk '{ if(($1>$2)||($1>$3)) { print $2} else {print $1} }'
2
[root@rhel77 ~]#
命令:
awk '{if ($9~/502|499|500|503|404|200/) print $1,$9}' access_log-20230514|sort|uniq -c|sort -nr | awk '{if($1>=10) print $2}'
[root@rhel77 logs]# awk '{if ($9~/502|499|500|503|404|200/) print $1,$9}' access_log-20230514|sort|uniq -c|sort -nr | awk '{if($1>=10) print $2}'
192.168.10.1
[root@rhel77 logs]#
命令:
ss -an | awk '/tcp/ {print $NF}' | sort | uniq -c
[root@rhel77 logs]# ss -an | awk '/tcp/ {print $NF}' | sort | uniq -c
7 [::]:*
9 *:*
1 192.168.10.1:62981
1 192.168.10.1:64368
[root@rhel77 logs]#