序言

在 Unix 和 Linux 系统中,有一组被称为“三剑客”的命令行工具,它们是 grep、sed 和 awk。虽然它们在外表上看起来很简单,但它们的功能却非常强大,为文本处理提供了无限可能。本文将深入探讨这三个工具的用法和功能,以展示它们在日常工作中的重要性和价值。

一、grep:文本搜索的得力助手

grep 命令是 “Global Regular Expression Print” 的缩写,它用于在文本文件中搜索指定模式的行,并将匹配到的行打印出来。grep 不仅支持简单的字符串匹配,还可以使用正则表达式进行高级匹配。

  1. 递归搜索目录:使用 -r 选项可以递归地搜索目录中的所有文件。
grep -r "keyword" directory
  1. 显示匹配行数:使用 -c 选项可以显示匹配到的行数。
grep -c "keyword" filename
  1. 显示匹配行以及上下文:使用 -A-B-C 选项可以显示匹配行的上下文。
# -A:在输出的时候包含结果所在行之后的指定行数。
# -B:在输出的时候包含结果所在行之前的指定行数。
# -C:在输出的时候包含结果所在行前后的指定行数。
grep -A 2 -B 2 "keyword" filename
  1. 其他常用选项
-i:在搜索时忽略大小写。
-v:输出不带关键字的行,也就是反向查询。
-n:显示结果所在行号。
-o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行。
-w:匹配整个单词,如果是字符串中包含这个单词,则不作匹配。
-l:只显示匹配命中的文件名称,而不显示具体匹配的内容。
-e:实现多个选项的匹配,逻辑 or 关系。
-f:从文件中获取模式

二、sed:流编辑器的魔力

sed 命令是 “Stream Editor” 的缩写,它是一种流编辑器,用于对文本进行逐行处理。sed 可以执行替换、删除、插入等操作,通常与正则表达式结合使用,对文本进行灵活的编辑。

  1. 编辑文件并保存:使用 -i 选项可以直接编辑文件并保存修改。
sed -i 's/apple/orange/g' filename
  1. 只在特定行进行替换:使用行号或正则表达式指定替换的行范围。
sed '10s/apple/orange/g' filename   # 替换第 10 行的 apple 为 orange
sed '/pattern/s/apple/orange/g' filename   # 替换包含特定模式的行中的 apple 为 orange
  1. 删除空白行:使用 /^$/d 命令可以删除空白行。
sed '/^$/d' filename
  1. 其他常用选项
-e:允许使用多个编辑命令。
-f:允许指定包含 sed 命令的文件。
-r:使用扩展正则表达式。
-u:使缓冲区无缓冲。
-n:取消默认输出,sed 默认会输出所有文本内容,使用 -n 参数后只显示处理过的行

三、awk:文本处理的瑞士军刀

awk 命令是由其创始人(Alfred Aho、Peter Weinberger 和 Brian Kernighan)的首字母组成的缩写,它是一种强大的文本处理工具,可以对文本文件进行逐行扫描,并根据指定的规则进行处理和操作。awk 以行为单位进行处理,可以方便地对字段进行分割和处理,并支持自定义函数和变量。

  1. 计算文件中某列的总和:通过累加每行的某个字段,可以计算出该字段的总和。
awk '{sum+=$1} END {print sum}' filename
  1. 输出指定字段的唯一值:使用数组保存已经出现过的值,以保证唯一性。
awk '!seen[$1]++' filename
  1. 按条件筛选行并处理:使用条件语句进行筛选,并在符合条件的行上执行特定的操作。
awk '$2 > 10 {print $1,$2*2}' filename   # 如果第二列大于 10,则打印第一列和第二列乘以 2 的结果