序言
在 Unix 和 Linux 系统中,有一组被称为“三剑客”的命令行工具,它们是 grep、sed 和 awk。虽然它们在外表上看起来很简单,但它们的功能却非常强大,为文本处理提供了无限可能。本文将深入探讨这三个工具的用法和功能,以展示它们在日常工作中的重要性和价值。
一、grep:文本搜索的得力助手
grep 命令是 “Global Regular Expression Print” 的缩写,它用于在文本文件中搜索指定模式的行,并将匹配到的行打印出来。grep 不仅支持简单的字符串匹配,还可以使用正则表达式进行高级匹配。
-
递归搜索目录:使用
-r
选项可以递归地搜索目录中的所有文件。grep -r "keyword" directory
-
显示匹配行数:使用
-c
选项可以显示匹配到的行数。grep -c "keyword" filename
-
显示匹配行以及上下文:使用
-A
、-B
和-C
选项可以显示匹配行的上下文。# -A:在输出的时候包含结果所在行之后的指定行数。 # -B:在输出的时候包含结果所在行之前的指定行数。 # -C:在输出的时候包含结果所在行前后的指定行数。 grep -A 2 -B 2 "keyword" filename
-
其他常用选项
-i:在搜索时忽略大小写。 -v:输出不带关键字的行,也就是反向查询。 -n:显示结果所在行号。 -o:只显示符合条件的字符串,但是不整行显示,每个符合条件的字符串单独显示一行。 -w:匹配整个单词,如果是字符串中包含这个单词,则不作匹配。 -l:只显示匹配命中的文件名称,而不显示具体匹配的内容。 -e:实现多个选项的匹配,逻辑 or 关系。 -f:从文件中获取模式
二、sed:流编辑器的魔力
sed 命令是 “Stream Editor” 的缩写,它是一种流编辑器,用于对文本进行逐行处理。sed 可以执行替换、删除、插入等操作,通常与正则表达式结合使用,对文本进行灵活的编辑。
-
编辑文件并保存:使用
-i
选项可以直接编辑文件并保存修改。sed -i 's/apple/orange/g' filename
-
只在特定行进行替换:使用行号或正则表达式指定替换的行范围。
sed '10s/apple/orange/g' filename # 替换第 10 行的 apple 为 orange sed '/pattern/s/apple/orange/g' filename # 替换包含特定模式的行中的 apple 为 orange
-
删除空白行:使用
/^$/d
命令可以删除空白行。sed '/^$/d' filename
-
其他常用选项
-e:允许使用多个编辑命令。 -f:允许指定包含 sed 命令的文件。 -r:使用扩展正则表达式。 -u:使缓冲区无缓冲。 -n:取消默认输出,sed 默认会输出所有文本内容,使用 -n 参数后只显示处理过的行
三、awk:文本处理的瑞士军刀
awk 命令是由其创始人(Alfred Aho、Peter Weinberger 和 Brian Kernighan)的首字母组成的缩写,它是一种强大的文本处理工具,可以对文本文件进行逐行扫描,并根据指定的规则进行处理和操作。awk 以行为单位进行处理,可以方便地对字段进行分割和处理,并支持自定义函数和变量。
-
计算文件中某列的总和:通过累加每行的某个字段,可以计算出该字段的总和。
awk '{sum+=$1} END {print sum}' filename
-
输出指定字段的唯一值:使用数组保存已经出现过的值,以保证唯一性。
awk '!seen[$1]++' filename
-
按条件筛选行并处理:使用条件语句进行筛选,并在符合条件的行上执行特定的操作。
awk '$2 > 10 {print $1,$2*2}' filename # 如果第二列大于 10,则打印第一列和第二列乘以 2 的结果
推荐阅读
- Zookeeper 注册中心:单机部署
- 【JavaScript】探索 JavaScript 中的解构赋值
- 深入理解 JavaScript 中的 Promise、async 和 await
- 探索生产者/消费者模式:解决并发编程中的资源竞争
- 深入探究 Spring Boot Starter:从概念到实践