AWK——————————复习巩固

参考链接

        三十分钟学会AWK

引子 

      作为一款Linux文本处理工具,AWK在很多情况下是非常有用的。当然,其他的文本处理工具并不能缺席。虽然,我今天复习的重点是AWK编程语言。

       比如,你想要实现如下需求:  

  1. 在一堆运行的java进程中获取你想要监控的java进程,假设其包名为demo.jar。这里假设没有其他进程还有demo这样的字眼。
  2. 获取到demo.jar之后,我们想要获取该进程的进程号。
  3. 拿到进程号后,需要监控该进程的内存使用情况。

      在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程序分为三部分:

  1. BEGIN 语句块。

    BEGIN {awk-commands}
  2. BODY 语句块。

    /pattern/ {awk-commands}
  3. 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语言之类的语言类似,基本上需要的功能都是有的,实际编码的过程中,可以查阅使用,不需要记忆

猜你喜欢

转载自blog.csdn.net/weixin_32501529/article/details/84578290