Linux Shell:`awk` 命令

Linux Shell:awk 命令

awk 是一种强大的文本分析工具,广泛用于文本处理、数据提取和报告生成。它使用自己的编程语言来处理文件中的数据。在 Linux Shell 中,awk 命令能够执行复杂的模式匹配、编辑和分析任务。本文将介绍 awk 的基础用法、高级功能和一些实用的示例。

基础用法

语法和工作流程

awk 命令的基本语法如下:

shell 复制代码
awk 'pattern {action}' file

这里,pattern 表示一个条件表达式,用于匹配文件中的文本行;action 是一组在匹配到 pattern 的文本行上执行的命令,用大括号 {} 包围。如果省略 pattern,则 action 会在文件的每一行上执行。

awk 读取输入文件的每一行,并将其分割成字段,字段默认由空格分隔。这些字段可以通过 $1, $2, $3 等访问,其中 $0 表示整行文本。

常用示例

  1. 打印文件内容

    使用 awk 打印文件的每一行:

    shell 复制代码
    awk '{print}' file.txt
  2. 过滤和打印特定字段

    打印文件每一行的第一个和第三个字段:

    shell 复制代码
    awk '{print $1, $3}' file.txt
  3. 条件过滤

    只打印第一个字段大于10的行:

    shell 复制代码
    awk '$1 > 10' file.txt

高级功能

内置变量

awk 提供了一系列内置变量,用于访问记录和字段的信息,如 NR(当前记录数)、NF(当前记录的字段数)、FS(字段分隔符)等。

数组

awk 支持一维和多维数组,可以用于存储和操作数据集合。

控制结构

awk 支持包括 if-else、while、for 在内的控制结构,使得数据处理更加灵活。

函数

awk 内置了字符串、数学和时间处理函数,用户还可以定义自己的函数。

实用示例

  1. 统计文件的行数和字段数

    shell 复制代码
    awk '{print "Line No:", NR, " - Fields:", NF}' file.txt
  2. 文本数据求和

    假设 file.txt 的第二列包含数字,求这些数字的总和:

    shell 复制代码
    awk '{sum += $2} END {print sum}' file.txt
  3. 字段排序

    对文件的第一列进行排序输出:

    shell 复制代码
    awk '{print $1}' file.txt | sort
  4. 文本替换

    将文件中匹配到的字符串替换为另一个字符串,并输出:

    shell 复制代码
    awk '{gsub(/old/, "new"); print}' file.txt
  5. 提取线程名

示例内容:

复制代码
"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则输出结果

参考链接

相关推荐
归秋1422 小时前
2026 企业 AI 办公工具选型指南:从评估框架到产品适配
大数据·运维·人工智能
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛3 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德3 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
辻弋2013 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
硅基手札4 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨6 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业6 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
wuminyu6 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
快乐の番薯6 小时前
卷王问卷考试系统自动化功能测试
运维·功能测试·自动化