Linux 文本处理三剑客:grep、sed、awk 完全指南

一、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" /path

  • grep 如何匹配多个关键词(或关系)?
    → 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 开发、数据处理能力的核心体现。

建议练习方式

  1. 用 grep 快速查找

  2. 用 sed 批量替换

  3. 用 awk 格式化输出

不断实践,逐步构建自己的常用命令库,效率将成倍提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值