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

目录
相关文章
|
19天前
|
Linux Perl
Linux|从 STDIN 读取 Awk 输入
Linux|从 STDIN 读取 Awk 输入
20 4
|
1月前
|
Linux Perl
Linux技巧|Awk 比较运算符
在 Awk 中,使用比较运算符(如 &gt;, &lt;, ==, != 等)可方便地过滤文本和字符串。本文通过示例展示了如何处理食品购物清单,标记数量小于或等于 20 的商品。 Awk 语法 `expression { actions; }` 用于根据条件执行操作,如在满足条件的行末尾添加特殊标记。例如,`$3 &lt;= 20 { printf &quot;%s\t%s\n&quot;, $0,&quot;TRUE&quot; ; }` 会在数量小于或等于 20 的行后添加 &quot;TRUE&quot;。继续探索 Awk 的比较运算符以进行更复杂的文本处理。
25 2
|
1月前
|
搜索推荐 Linux 开发工具
【Linux】深入理解awk命令
【Linux】深入理解awk命令
45 0
|
2月前
|
Linux Perl
百度搜索:蓝易云【Linux常用命令awk】
以上仅是awk命令的一些常见用法,它还有许多更复杂的功能和用法,可以根据需要灵活运用。awk在文本处理和数据分析中非常实用,是Linux系统中的一把利器。
25 2
|
3月前
|
监控 Linux BI
linux命令之awk
linux命令之awk
25 4
|
4月前
|
Unix Java Linux
Linux脚本中的字符处理与awk编程|WC统计
Linux脚本中的字符处理与awk编程|WC统计
48 0
|
5月前
|
存储 Linux Shell
Linux awk命令
除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk。 曾有人推测 awk 命令的名字来源于 awkward 这个单词。其实不然,此命令的设计者有 3 位,他们的姓分别是 Aho、Weingberger 和 Kernighan,awk 就取自这 3 为大师姓的首字母。 和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。awk 命令的基本格式为: [root@localhost ~]# awk [选项] '脚本命令' 文件名
73 1
|
6月前
|
Unix 测试技术 Linux
软件测试|Linux三剑客之awk命令详解
软件测试|Linux三剑客之awk命令详解
69 0
|
1月前
|
存储 监控 Linux
性能工具之linux三剑客awk、grep、sed详解
Linux 三剑客 awk,sed和grep 在性能领域广泛用于性能建模、性能监控及性能分析等方面,也是各大互联网公司测试岗高频面试题,中高端测试人员必备技能之一。
53 1
性能工具之linux三剑客awk、grep、sed详解
|
8月前
|
Linux Perl
百度搜索:蓝易云【linux系统awk命令使用详解】
Awk是一种强大的文本处理工具,在Linux系统中广泛使用。它可以读取文件、处理数据并输出结果,通常与其他Linux命令一起使用。在本篇文章中,我们将详细讲解Awk的使用方法,帮助读者了解这个工具的基本原理和常见用法。
69 0