一、grep:文本搜索工具
grep(Global Regular Expression Print)用于按行搜索文本,支持正则表达式匹配。
1.1 基本使用
| 参数 | 说明 |
|---|---|
-i | 忽略大小写 |
-n | 显示匹配行的行号 |
-v | 反向匹配(显示不匹配的行) |
-r / -R | 递归搜索目录 |
-A n | 显示匹配行及之后 n 行(After) |
-B n | 显示匹配行及之前 n 行(Before) |
-C n | 显示匹配行及前后各 n 行(Context) |
-e | 指定多个匹配模式(支持逻辑或) |
-E | 使用扩展正则表达式(ERE) |
-P | 使用 Perl 兼容正则表达式(PCRE) |
1.2 正则表达式模式
-
grep 默认使用基本正则表达式(BRE),如
\(\)、\|\需要转义。 grep -E或egrep:使用扩展正则表达式(ERE),无需转义()、|等符号。grep -P:使用 PCRE,支持更多高级特性(如\d、\w)。
1.3 常用组合示例
# 在目录下递归查找包含 error 的行,并显示行号
grep -nir error /var/log/
# 显示匹配行及其后 3 行
grep -A 3 "ERROR" app.log
# 匹配多个关键词(或)
grep -E "error|fatal|panic" app.log
1.4 数据来源
grep 可以处理两种输入来源:
- 文件:
grep pattern file- 管道:
command | grep pattern
二、sed:流式编辑器
sed(Stream Editor)用于对文本进行非交互式编辑,适合批量替换、删除、插入操作。
2.1 基本格式
sed [选项] '范围 动作' 文件
2.2 常用选项
| 选项 | 说明 |
|---|---|
-n | 关闭默认输出,仅输出处理内容 |
-i | 直接修改文件内容(慎用,建议先备份) |
-i.bak | 修改前自动备份 |
-r / -E | 使用扩展正则表达式 |
-e | 同时执行多个 sed 指令 |
2.3 范围指定方式
| 范围 | 说明 |
|---|---|
n | 第 n 行 |
n,m | 第 n 到 m 行 |
/pattern/ | 匹配 pattern 的行 |
/pattern1/,/pattern2/ | 从匹配 pattern1 的行到匹配 pattern2 的行 |
2.4 常用动作
| 动作 | 说明 |
|---|---|
p | 打印行(常与 -n 配合) |
d | 删除行 |
s/old/new/ | 替换第一个匹配的 old |
s/old/new/g | 全局替换 |
i\ | 在指定行前插入内容 |
a\ | 在指定行后追加内容 |
2.5 使用示例
# 删除文件的第 3 到 6 行
sed -i '3,6d' file.txt
# 将文件中的 root 替换为 admin(全局)
sed -i 's/root/admin/g' file.txt
# 在第 2 行前插入一行内容
sed -i '2i\insert-content' file.txt
# 同时执行多个动作(用 ; 分隔)
sed -i 's/old/new/g; s/foo/bar/g' file.txt
# 使用 -e 指定多个动作
sed -e 's/old/new/' -e '/^$/d' file.txt
2.6 边界符号
s///中的分隔符可以使用任意字符,例如s###、s@@@,便于避免转义:
sed 's#/etc#/opt#g' file.txt
三、awk:文本处理语言
awk 是一种强大的文本处理语言,支持列操作、条件判断、数组、函数等,常用于结构化文本的格式化与统计。
3.1 基本格式
awk '条件 { 动作 }' 文件
条件:默认省略时为“真”(始终执行)
动作:默认省略时为
{ print $0 }(打印整行)
3.2 完整结构
awk 'BEGIN { 初始化 } 条件 { 处理 } END { 收尾 }' 文件
3.3 常用变量
| 变量 | 说明 |
|---|---|
$0 | 当前行 |
$1, $2, ... | 第 1 列、第 2 列(默认按空白分隔) |
NF | 当前行的列数 |
NR | 当前行的行号(从 1 开始) |
FS | 输入字段分隔符(默认为空白) |
OFS | 输出字段分隔符(默认为空格) |
RS | 输入行分隔符(默认为换行) |
ORS | 输出行分隔符(默认为换行) |
3.4 字段与行控制
# 按冒号分隔,输出第 2 列
awk -F: '{print $2}' /etc/passwd
# 输出最后一列
awk '{print $NF}' file
# 输出倒数第二列(需加括号)
awk '{print $(NF-1)}' file
# 输出第 2 行
awk 'NR==2 {print}' file
# 匹配含 root 的行
awk '/root/ {print}' file
# 修改字段分隔符与输出分隔符
awk 'BEGIN{FS=":"; OFS="---"} {print $1, $3}' /etc/passwd
3.5 修改变量
使用
-v选项在 awk 外部传入变量:
awk -v sep=":" '{print $1 sep $3}' file
3.6 关键区分
=:赋值
==:比较相等字符串:用引号包裹
变量:不加引号
3.7 常用统计示例
# 统计总行数
awk 'END{print NR}' file
# 对某一列求和
awk '{sum += $3} END{print sum}' file
# 按条件过滤并输出
awk '$3 > 100 {print $1, $2}' file
四、三剑客对比与适用场景
| 工具 | 定位 | 典型场景 |
|---|---|---|
| grep | 查找与过滤 | 快速定位文件中的关键词,检查日志、配置文件 |
| sed | 编辑与替换 | 批量修改文件内容,删除空行,插入配置项 |
| awk | 格式化与统计 | 处理表格数据,按列提取、计算、统计 |
五、面试常见问题
5.1 grep
如何在一个目录下递归查找包含某字符串的文件并显示行号?
→grep -nir "pattern" /pathgrep 如何匹配多个关键词(或关系)?
→grep -E "err|warn"或grep -e err -e warn
5.2 sed
如何一条 sed 命令执行多个替换动作?
→ 使用-e或用;分隔:sed -e 's/old/new/' -e 's/foo/bar/' file如何安全修改文件内容?
→sed -i.bak 's/old/new/g' file(自动备份原文件)
5.3 awk
如何打印文件的最后一列?
→awk '{print $NF}' file如何打印倒数第二列?
→awk '{print $(NF-1)}' file如何按自定义分隔符输出指定列?
→awk 'BEGIN{FS=":"; OFS="-"} {print $1, $3}' file
六、总结
grep、sed、awk 虽然定位不同,但在实际工作中往往配合使用,构成强大的文本处理流水线。
掌握三剑客,是 Linux 运维、Shell 开发、数据处理能力的核心体现。
建议练习方式:
用 grep 快速查找
用 sed 批量替换
用 awk 格式化输出
不断实践,逐步构建自己的常用命令库,效率将成倍提升。

3533

被折叠的 条评论
为什么被折叠?



