参考链接
引子
作为一款Linux文本处理工具,AWK在很多情况下是非常有用的。当然,其他的文本处理工具并不能缺席。虽然,我今天复习的重点是AWK编程语言。
比如,你想要实现如下需求:
- 在一堆运行的java进程中获取你想要监控的java进程,假设其包名为demo.jar。这里假设没有其他进程还有demo这样的字眼。
- 获取到demo.jar之后,我们想要获取该进程的进程号。
- 拿到进程号后,需要监控该进程的内存使用情况。
在Linux系统下,我的实现如下:
jps | grep demo.jar # 获取进程信息
jps | grep demo.jar | | awk '{print $1}' #获取进程号
jstat -gcutil `jps | grep demo.jar | awk '{print $1}'` 1000 1000 # 监控内存使用状态
在上面的代码中,前两行是分解动作,最后一行代码才是真正的实现代码。这样做的好处是什么?恩,思考一下,当我们进行java程序调优的时候,是不是需要不断地重启程序?答案是肯定的,那么我们想每次分步骤手动查找新启动的程序的端口号,然后再去监控内存吗?如果是,请忽略这段代码。如果不是,恩,那最后一行代码就是你的福音。这一行代码中,包含的东西其实挺多的,但是,我们今天的中的是awk。至于管道,grep,jps,jstat,大家可以自行去了解。
基本语法
AWK使用分为两种,一种是将AWK代码卸载一个文件中,另一种是在命令行中直接使用,只需要将AWK代码写在单引号中即可。我只复习命令行使用的方式,文件方式大同小异。
AWK程序分为三部分:
-
BEGIN 语句块。
BEGIN {awk-commands}
-
BODY 语句块。
/pattern/ {awk-commands}
-
END 语句块。
END {awk-commands}
使用示例
awk '{print $3 "\t" $4}' test.txt # 打印第三列和第四列
awk '/a/ {print $0}' marks.txt #打印文本中含有a的所有行
awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt # 打印文本中含有a的行的总数量
awk 'length($0) = 25' demo.txt # 找到文本中行中字符数恰好为25的行
内建变量
内建变量我认为比较重要的是NF,NR,FS,$n,AGRV,ARGC等,对于其他的内建变量可以在需要的时候查阅。
awk 'BEGIN {print "Arguments =", ARGC}' 1.txt 2.txt 3.txt #ARGC表示命令行参数个数
awk 'BEGIN {print "Arguments =", ARGV[0]}' 1.txt 2.txt 3.txt #ARGV表示命令行参数数组
awk 'BEGIN { print "Conversion Format =", CONVFMT }' #CONVFMT 数字的约定格式
awk 'BEGIN { print ENVIRON["USER"] }' #ENVIRON 环境变量数组
awk 'END {print FILENAME}' marks.txt #FILENAME 当前文件名
awk 'BEGIN {print "FS = " FS}' marks.txt #FS 字段分隔符
awk -F , 'BEGIN {print "FS = " FS}' # 修改字段分隔符
echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2' #NF 当前行的字段数目
echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3' #NR 当前行的行号
awk '{print $0}' marks.txt # $0 代表了当前行
awk '{print $3 "\t" $4}' marks.txt # $n 代表了当前行的第n列
操作符
AWK支持的操作符与c语言之类的语言类似,基本上需要的功能都是有的,实际编码的过程中,可以查阅使用,不需要记忆