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-elsewhilefor 在内的控制结构,使得数据处理更加灵活。

函数

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则输出结果

参考链接

相关推荐
demodashi66615 分钟前
ARM64的Mac Node.js前置工作,nvm在线安装
linux·运维·macos
这题怎么做?!?15 分钟前
【Linux】网络编程:实现一个简易的基于HTTP协议格式、TCP传输的服务器,处理HTTP请求并返回HTTP响应;GET方法再理解
linux·服务器·c语言·网络·c++·tcp/ip·http
vvw&1 小时前
使用Ubuntu快速部署MinIO对象存储
linux·运维·服务器·ubuntu·minio·cos·oss
网络安全指导员3 小时前
常见网络安全设备默认口令
服务器·网络·安全·web安全·php·apache
三项超标5 小时前
docker run集合
运维·docker·容器
fengxiaolu3115 小时前
docker pull 拉取镜像失败,使用Docker离线包
运维·docker·容器
归仁6 小时前
wvp 推拉转级联时频繁出现流无法观看的解决办法
linux·服务器·python·音视频
万叶学编程6 小时前
Linux之初体验
linux
小小不董7 小时前
Oracle OCP认证考试考点详解082系列08
linux·运维·服务器·数据库·oracle·dba
zwm_yy8 小时前
ubantu lnmp
运维·mysql·lnmp·ubantu