Linux awk

1.awk介绍

    awk是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK,awk是一个行级文本高效处理工具,awk经过改进生成的新的版本有nawk、gawk,一般Linux默认为gawk,gawk是awk的GNU开源免费版本。

    awk基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行

2.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

3.样例

3.1.awk打印硬盘设备名称,默认以空格为分割

命令:

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 ~]# 

3.2.awk以空格、冒号、\t、分号为分割

命令:

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 ~]# 

3.3.awk以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log

命令:

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 ~]# 

3.4.打印ztj.txt文件中的第3行至第5

命令:

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 ~]# 

3.5.打印ztj.txt文件中,长度大于80的行号

命令:

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 ~]# 

3.6.awk以冒号切割,打印第一列同时只显示前5

命令:

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 ~]# 

3.7.awk指定文件ztj.txt第二列的数字求总和

命令:

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 ~]# 

3.8.awk NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕

命令:

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 ~]# 

3.9.awk添加自定义字符

命令:

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 ~]# 

3.10.awk数字判断比较

命令:

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 ~]# 

3.11.awk分析Nginx访问日志的状态码404502、200等信息页面,统计次数大于10IP地址

命令:

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]# 

3.12.awk统计服务器状态连接数

命令:

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]# 

你可能感兴趣的:(linux三剑客,linux,运维,服务器,awk)