插件窝 干货文章 掌握 Linux awk 命令全面指南

掌握 Linux awk 命令全面指南

print file awk bash 588    来源:    2025-04-17

Linux awk 命令全面指南

什么是awk?

awk 是一种强大的文本处理工具,它既是编程语言也是命令行工具,主要用于模式扫描和处理文本数据。awk 名称来自其三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。

基本语法

awk [options] 'pattern {action}' file
  • pattern:匹配模式
  • action:匹配后执行的动作
  • file:要处理的文件

常用选项

选项 说明
-F fs 指定字段分隔符
-v var=value 定义变量
-f scriptfile 从脚本文件读取awk命令

基本用法示例

1. 打印文件内容

awk '{print}' file.txt      # 打印整个文件
awk '{print $0}' file.txt   # 同上,$0表示整行

2. 打印特定字段

awk '{print $1}' file.txt   # 打印第一列
awk '{print $1,$3}' file.txt # 打印第一和第三列

3. 指定分隔符

awk -F':' '{print $1}' /etc/passwd  # 使用冒号作为分隔符

4. 内置变量

变量 说明
NR 当前记录数(行号)
NF 当前记录的字段数
FS 字段分隔符(默认空格)
OFS 输出字段分隔符(默认空格)
RS 记录分隔符(默认换行)
ORS 输出记录分隔符(默认换行)

示例:

awk '{print NR,NF,$0}' file.txt  # 打印行号,字段数和整行

模式匹配

1. 字符串匹配

awk '/pattern/ {print}' file.txt  # 打印包含pattern的行

2. 关系表达式

awk '$3 > 100 {print}' file.txt   # 第三列大于100的行

3. 范围模式

awk '/start/,/end/' file.txt      # 从匹配start到匹配end的行

动作语句

1. 条件语句

awk '{if ($1 > 50) print $1; else print "小于等于50"}' file.txt

2. 循环语句

awk '{for(i=1;i<=NF;i++) print $i}' file.txt  # 打印每个字段

3. 数组

awk '{count[$1]++} END {for(item in count) print item, count[item]}' file.txt

内置函数

1. 字符串函数

awk '{print length($0)}' file.txt          # 计算行长度
awk '{print substr($1,2,3)}' file.txt      # 提取子串
awk '{print toupper($1)}' file.txt         # 转换为大写
awk '{print tolower($1)}' file.txt         # 转换为小写

2. 数学函数

awk '{print sqrt($1)}' file.txt            # 平方根
awk '{print int($1)}' file.txt             # 取整

3. 时间函数

awk 'BEGIN {print systime()}'              # 当前时间戳

高级用法

1. BEGIN和END块

awk 'BEGIN {print "开始处理"} {print} END {print "处理结束"}' file.txt

2. 自定义函数

awk 'function myfunc(x) {return x*x} {print myfunc($1)}' file.txt

3. 多文件处理

awk '{print FILENAME, NR, $0}' file1.txt file2.txt

4. 输出重定向

awk '{print > "output.txt"}' file.txt

实用示例

  1. 统计文件行数
awk 'END {print NR}' file.txt
  1. 计算列总和
awk '{sum += $1} END {print sum}' file.txt
  1. 查找重复行
awk '{a[$0]++} END {for(i in a) if(a[i]>1) print i}' file.txt
  1. 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' file.txt
  1. 处理CSV文件
awk -F',' '{print $1,$3}' data.csv

性能优化技巧

  1. 对于大文件,避免在动作块中使用正则表达式匹配
  2. 使用单引号而非双引号减少shell解释开销
  3. 尽可能使用内置函数而非自定义函数
  4. 避免不必要的变量赋值
  5. 使用next跳过不相关的行

awk是一个极其强大的工具,掌握它可以显著提高文本处理效率。建议通过实际练习来巩固这些知识。