Skip to content

awk 命令:文本处理工具

1. 简介

awk 是一个强大的文本处理工具,也是一种编程语言。它擅长处理结构化的文本数据,可以对文本进行复杂的模式匹配、数据提取、计算和报告生成。awk 的名称来源于其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。

2. 基本语法

bash
awk 'pattern { action }' file

3. 常用选项

  • -F fs:指定字段分隔符
  • -v var=value:设置变量
  • -f script-file:从文件中读取 awk 脚本

内置变量:

  • $0:整行内容
  • $1, $2, …:第1、2、…个字段
  • NF:当前行的字段数
  • NR:当前处理的行号
  • FS:字段分隔符(默认是空格)
  • OFS:输出字段分隔符

4. 基础使用示例

  1. 打印文件的特定列:

    bash
    awk '{ print $1 }' file.txt  # 打印第一列
  2. 使用自定义分隔符:

    bash
    awk -F: '{ print $1 }' /etc/passwd  # 以冒号为分隔符,打印第一列
  3. 根据条件打印:

    bash
    awk '$3 > 100 { print $0 }' file.txt  # 打印第三列大于100的行
  4. 计算总和:

    bash
    awk '{ sum += $1 } END { print sum }' file.txt  # 计算第一列的总和

5. 进阶使用技巧

  1. 使用内建变量:

    bash
    awk '{ print NR, $0 }' file.txt  # NR表示行号
  2. 使用正则表达式:

    bash
    awk '/pattern/ { print $0 }' file.txt
  3. 使用多个条件:

    bash
    awk '$1 == "foo" && $2 > 50 { print $0 }' file.txt
  4. 使用 BEGIN 和 END 块:

    bash
    awk 'BEGIN { print "Start" } { print $0 } END { print "End" }' file.txt

6. 实用示例

  1. 计算文件的行数、单词数和字符数:

    bash
    awk '{ chars += length($0) + 1; words += NF } END { print NR, words, chars }' file.txt
  2. 提取特定列并按特定列排序:

    bash
    awk '{ print $2, $1 }' file.txt | sort -k1,1n
  3. 找出最长的行:

    bash
    awk '{ if (length($0) > max) { max = length($0); maxline = $0 } } END { print maxline }' file.txt
  4. 生成简单的 HTML 表格:

    bash
    awk 'BEGIN { print "<table>" } { print "<tr><td>" $1 "</td><td>" $2 "</td></tr>" } END { print "</table>" }' file.txt

7. 注意事项

  • awk 默认以空白字符(空格或制表符)作为字段分隔符。
  • awk 脚本中的单引号和双引号有不同的含义,使用时需要注意。
  • 复杂的 awk 脚本可能难以阅读和维护,考虑将其保存为单独的文件。

8. 相关命令

  • sed:流编辑器,适合简单的文本转换
  • grep:用于模式匹配的搜索
  • cut:用于提取文件的列
  • sort:用于排序文本行

9. 技巧与建议

  1. 使用 -v 选项传递外部变量:

    bash
    awk -v threshold=100 '$3 > threshold { print $0 }' file.txt
  2. 使用数组处理复杂数据:

    bash
    awk '{ count[$1]++ } END { for (word in count) print word, count[word] }' file.txt
  3. awk 中使用系统命令:

    bash
    awk '{ system("echo " $0) }' file.txt
  4. 使用 printf 格式化输出:

    bash
    awk '{ printf "%-10s %d\n", $1, $2 }' file.txt

awk 是一个非常强大和灵活的文本处理工具。它不仅可以用于简单的文本分析,还可以编写复杂的程序来处理和转换数据。掌握 awk 可以大大提高文本和数据处理的效率,特别是在处理结构化数据、生成报告和进行数据分析时。