Linux Shell:awk
命令
awk
是一种强大的文本分析工具,广泛用于文本处理、数据提取和报告生成。它使用自己的编程语言来处理文件中的数据。在 Linux Shell 中,awk
命令能够执行复杂的模式匹配、编辑和分析任务。本文将介绍 awk
的基础用法、高级功能和一些实用的示例。
基础用法
语法和工作流程
awk
命令的基本语法如下:
shell
awk 'pattern {action}' file
这里,pattern
表示一个条件表达式,用于匹配文件中的文本行;action
是一组在匹配到 pattern
的文本行上执行的命令,用大括号 {}
包围。如果省略 pattern
,则 action
会在文件的每一行上执行。
awk
读取输入文件的每一行,并将其分割成字段,字段默认由空格分隔。这些字段可以通过 $1
, $2
, $3
等访问,其中 $0
表示整行文本。
常用示例
-
打印文件内容
使用
awk
打印文件的每一行:shellawk '{print}' file.txt
-
过滤和打印特定字段
打印文件每一行的第一个和第三个字段:
shellawk '{print $1, $3}' file.txt
-
条件过滤
只打印第一个字段大于10的行:
shellawk '$1 > 10' file.txt
高级功能
内置变量
awk
提供了一系列内置变量,用于访问记录和字段的信息,如 NR
(当前记录数)、NF
(当前记录的字段数)、FS
(字段分隔符)等。
数组
awk
支持一维和多维数组,可以用于存储和操作数据集合。
控制结构
awk
支持包括 if-else
、while
、for
在内的控制结构,使得数据处理更加灵活。
函数
awk
内置了字符串、数学和时间处理函数,用户还可以定义自己的函数。
实用示例
-
统计文件的行数和字段数
shellawk '{print "Line No:", NR, " - Fields:", NF}' file.txt
-
文本数据求和
假设
file.txt
的第二列包含数字,求这些数字的总和:shellawk '{sum += $2} END {print sum}' file.txt
-
字段排序
对文件的第一列进行排序输出:
shellawk '{print $1}' file.txt | sort
-
文本替换
将文件中匹配到的字符串替换为另一个字符串,并输出:
shellawk '{gsub(/old/, "new"); print}' file.txt
-
提取线程名
示例内容:
"Attach Listener" #410 daemon prio=9 os_prio=0 cpu=0.95ms elapsed=23.42s tid=0x00007efcec001800 nid=0x3afc waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"VM Thread" os_prio=0 cpu=16838.04ms elapsed=7893.98s tid=0x00007efd3410c000 nid=0xe4d runnable
"GC Thread#0" os_prio=0 cpu=25892.92ms elapsed=7894.00s tid=0x00007efd3403b000 nid=0xe4a runnable
"GC Thread#1" os_prio=0 cpu=25976.88ms elapsed=7893.69s tid=0x00007efd00001000 nid=0xe58 runnable
"GC Thread#2" os_prio=0 cpu=25870.39ms elapsed=7893.69s tid=0x00007efd00002800 nid=0xe59 runnable
"GC Thread#3" os_prio=0 cpu=26030.61ms elapsed=7893.69s tid=0x00007efd00004800 nid=0xe5a runnable
"GC Thread#4" os_prio=0 cpu=26117.53ms elapsed=7892.88s tid=0x00007efd0000a800 nid=0xe6b runnable
"GC Thread#5" os_prio=0 cpu=25883.62ms elapsed=7892.88s tid=0x00007efd0000c000 nid=0xe6c runnable
"GC Thread#6" os_prio=0 cpu=26060.07ms elapsed=7892.88s tid=0x00007efd0000e000 nid=0xe6d runnable
"GC Thread#7" os_prio=0 cpu=25909.10ms elapsed=7892.88s tid=0x00007efd0000f800 nid=0xe6e runnable
"CMS Main Thread" os_prio=0 cpu=21894.02ms elapsed=7894.00s tid=0x00007efd340ab800 nid=0xe4c runnable
"CMS Thread#0" os_prio=0 cpu=6337.31ms elapsed=7894.00s tid=0x00007efd340a8800 nid=0xe4b runnable
"CMS Thread#1" os_prio=0 cpu=6391.38ms elapsed=7892.87s tid=0x00007efcfc001000 nid=0xe6f runnable
-
输出cpu时间
grep "GC" 20210420.md|awk '{print $4}'
tips:
awk
命令默认以空格分割 -
输出cpu时间大于26000ms的线程名
grep "GC" 20210420.md|awk -F '[ =ms]' '$7>26000 {print $0}'|awk '{print $2}'
-F [ =ms]
的意思是,先以空格分割,再用等号分割,最后以ms分割
'$7>26000 {print $0}'
参数7大于26000则输出结果