Linux awk

简介: 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访问日志的状态码404、502、200等信息页面,统计次数大于10的IP地址
命令:

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

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/z19861216/article/details/132707036

目录
相关文章
|
8月前
|
Linux Perl
Linux|从 STDIN 读取 Awk 输入
Linux|从 STDIN 读取 Awk 输入
54 4
|
14天前
|
监控 Linux 数据处理
Linux grep技巧 结合awk查询
结合 `grep` 和 `awk`,可以实现灵活、高效的文本处理和数据分析。`grep` 用于快速过滤符合条件的行,`awk` 用于进一步处理和提取数据。这种组合使用在日志分析、数据处理和系统监控等场景中尤为常见。掌握这两者的基本用法和组合技巧,可以大大提升在 Linux 环境下的工作效率。
41 7
|
5月前
|
Linux Perl
在Linux中,如何使用请用 cut 或者 awk,sed命令取出 linux 中 eth0 的 IP 地址?
在Linux中,如何使用请用 cut 或者 awk,sed命令取出 linux 中 eth0 的 IP 地址?
|
3月前
|
Linux Perl
Linux awk命令使用技巧
【10月更文挑战第16天】Linux awk命令使用技巧
57 4
|
3月前
|
存储 安全 Linux
Linux文件管理命令md5sum awk
通过结合 `md5sum`和 `awk`,不仅可以高效地进行文件完整性校验,还能灵活地处理和分析校验结果,为系统管理、数据审计等工作提供强大的支持。
98 2
|
5月前
|
Linux 数据处理 Perl
在Linux中,awk命令的如何使用?
在Linux中,awk命令的如何使用?
|
5月前
|
数据挖掘 Linux Perl
在Linux中,awk和sed命令的作用?
在Linux中,awk和sed命令的作用?
|
5月前
|
Linux BI 数据处理
在Linux中,如何使用awk和sed进行文本处理?
在Linux中,如何使用awk和sed进行文本处理?
|
5月前
|
存储 Unix Linux
|
7月前
|
存储 Linux BI
Linux 三剑客 grep、sed、awk
Linux三剑客`grep`、`sed`和`awk`是强大的文本处理工具。`grep`用正则表达式搜索匹配行;`sed`是流式编辑器,处理文本流而不直接修改原文件;`awk`则用于灵活的文本分析和报告生成。例如,`grep`可查找匹配模式,`sed`可以删除文件内容,而`awk`能提取特定字段。通过组合使用,它们能高效解决复杂文本任务。
84 1