简介
如果你是一位新手 Linux 用户,可能已经听说过 Awk 这个神奇的命令。Awk 是一种强大的文本处理工具,它可以在命令行中用于处理和分析文本数据。无论是数据提取、格式化、计算还是报告生成,Awk 都是个不可多得的工具。
什么是awk?
Awk 是一种面向文本处理的编程语言,最初由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在1977年开发。它以它们三人的姓氏首字母命名(Aho、Weinberger 和 Kernighan)。Awk 是一种解释型的语言,也是许多 Unix 系统中默认安装的工具之一。
awk的基本语法
语法格式:
awk 'pattern { action }' filename
语法说明:
pattern
:用于匹配的条件;action
:满足条件后执行的操作;filename
:要处理的文件名。
注:awk命令还可以扩展为awk ‘BEGIN {commands} pattern {commands} END {commands}' filename
,即在处理数据前和处理数据后都需要执行命令。
示例如下:
$ cat /etc/passwd|awk -F ":" 'BEGIN{print "###start###"} $3>500&&$3<2000 {print $1,$3}END{print "###end###"}'
###start###
polkitd 999
chrony 998
xiaowang 1000
chenhang 1001
zhnagjian 1002
zhangjian 1003
wangshenghu 1004
yalin 1005
nginx 997
lilanqing 1006
califeng 1007
cali123 1008
shimengmeng 1010
zhouyiwei 1011
zhaojunjie 1013
kimi 1014
kimi2 996
linhucong 1015
kimi3 1016
feng2 1018
feng3 1019
feng4 1020
feng5 1021
liudehua 1022
liming 1023
libai 1024
xiaoxiao 1025
xiyangyang 1026
meiyangyang 1027
lanyangyang 1028
zhangwuji 1029
liang 1030
###end###
这条命令的要求是,获取etc/passwd
的内容,并且打印出数值大于500小于2000的用户名及数值,在打印前输出start
,打印结束后输出end
。
awk的工作流程
由上面命令的执行效果,我们可以知道awk命令的工作流程如下:
- 执行
BEGIN{commands}
语句块中的语句; - 从文件或
stdin
中读取第一行,看有无模式匹配,若无则执行{}
中的语句; - 若有则检查该整行与
pattern
是否匹配,若匹配,则执行{}
中的语句; - 若不匹配则不执行
{}
中的语句,接着读取下一行; - 重复这个过程,直到所有行被读取完毕;
- 执行
END{commands}
语句块中的语句; BEGIN
和END
部分只是执行一次;- 中间部分每一行都执行一次。
指定分隔符
-F
指定分隔符
awk命令的默认分隔符为空格,如下所示:
$ cat grade.txt | awk '{print $2,$3,$4}'
name chinese english
cali 80 80
tom 90 90
jarry 70 100
- 分隔符不是空白时候可以使用
-F
选项来指定分隔符,如下所示:
$ cat /etc/passwd | tail | awk -F ":" '{print $1,$3,$4}'
sanle 9931 9932
test 9932 9935
wang 9933 9933
zhao 9934 9934
bobo 9935 9936
hang 9936 9937
mysql 27 27
bailongma 9937 9938
baigujing 9938 9939
yutujing 9939 9940
awk命令应用
- awk进行计算
示例:统计uid>1000
并且使用shell是bash
的用户的数量
$ awk -F ":" '$3>1000&&$7 ~ /bash/{print $1,$3,$7; i++}END{print "uid大于1000并且shell是bash的人数有:"i"人"}' passwd
chenhang 1001 /bin/bash
zhnagjian 1002 /bin/bash
zhangjian 1003 /bin/bash
wangshenghu 1004 /bin/bash
yalin 1005 /bin/bash
lilanqing 1006 /bin/bash
califeng 1007 /bin/bash
cali123 1008 /bin/bash
shimengmeng 1010 /bin/bash
zhouyiwei 1011 /bin/bash
zhaojunjie 1013 /bin/bash
kimi 1014 /bin/bash
linhucong 1015 /bin/bash
kimi3 1016 /bin/bash
feng2 1018 /bin/bash
feng3 1019 /bin/bash
feng4 1020 /bin/bash
feng5 1021 /bin/bash
liudehua 1022 /bin/bash
liming 1023 /bin/bash
xiaoxiao 1025 /bin/bash
xiyangyang 1026 /bin/bash
meiyangyang 1027 /bin/bash
lanyangyang 1028 /bin/bash
zhangwuji 1029 /bin/bash
liang 1030 /bin/bash
user01 9901 /bin/bash
user02 9902 /bin/bash
user03 9903 /bin/bash
user04 9904 /bin/bash
user05 9905 /bin/bash
user06 9906 /bin/bash
user07 9907 /bin/bash
user08 9908 /bin/bash
user09 9909 /bin/bash
zhangheng 9921 /bin/bash
zhaomin 9922 /bin/bash
wuji 9923 /bin/bash
liangluyao 9924 /bin/bash
pingguo 9925 /bin/bash
jingshi 9926 /bin/bash
yueyang 9927 /bin/bash
tangpj 9928 /bin/bash
tangpz1 9929 /bin/bash
sc1 9930 /bin/bash
test 9932 /bin/bash
wang 9933 /bin/bash
zhao 9934 /bin/bash
bobo 9935 /bin/bash
hang 9936 /bin/bash
bailongma 9937 /bin/bash
baigujing 9938 /bin/bash
yutujing 9939 /bin/bash
rrrge 9940 /bin/bash
uid大于1000并且shell是bash的人数有:54人
- awk的
if
和for
循环
if语句后面执行多个命令的时候,使用{}
括起来,最后的命令接``结尾,外面的else if
和 else
前面就不用再接;
了,示例如下:使用awk命令来输出passwd文件里哪些是超级用户,系统用户,普通用户。
$ awk -F ":" '{if($3 ==0 ) print $1"是超级用户";else if($3>1&&$3<=999) print $1"是系统用户"; else print $1"是普通用户"}' passwd
root是超级用户
bin是普通用户
daemon是系统用户
adm是系统用户
lp是系统用户
sync是系统用户
shutdown是系统用户
使用awk命令来输出passwd文件里哪些是超级用户,系统用户,普通用户。并输出各用户的个数。
$ awk -F : '{if($3 == 0){print $1"是超级用户";num1++;}else if($3>1 && $3 <1000){print $1"是系统用户";num2++;}else{print $1 "是普通用户";num3++;}}END{print"超级用户有:"num1"系统用户有:"num2"普通用户有:"num3}' passwd
root是超级用户
bin是普通用户
daemon是系统用户
adm是系统用户
lp是系统用户
sync是系统用户
shutdown是系统用户
halt是系统用户
mail是系统用户
operator是系统用户
games是系统用户
tcpdump是系统用户
sanle是普通用户
test是普通用户
wang是普通用户
zhao是普通用户
bobo是普通用户
hang是普通用户
mysql是系统用户
bailongma是普通用户
baigujing是普通用户
yutujing是普通用户
rrrge是普通用户
mengmeng1是普通用户
mengmeng2是普通用户
mengmeng3是普通用户
超级用户有:1系统用户有:23普通用户有:63
总结
Awk 是一个功能强大且灵活的工具,在处理文本数据时非常有用。虽然这里只介绍了一些基本用法和常见应用,但 Awk 的功能远不止于此。通过不断练习和探索,你将发现 Awk 在处理文本数据时的无限可能性。希望本文能够帮到大家!