ToolkitX
知识库工具箱

文本处理三剑客

grep, sed, awk 文本处理详解

30min·进阶

01. grep 命令

grep 说白了就是「文本搜索机」——在一堆文字里找你想要的行。名字挺古怪(Global Regular Expression Print),但用法超简单。你查日志、翻代码、找配置项,grep 都是第一选择:
bash
grep "error" /var/log/syslog              # 搜包含 error 的行
grep -i "error" file                       # 不管大小写都搜出来
grep -r "pattern" /path/                   # 在目录里翻个底朝天
grep -n "error" file                       # 显示行号,方便定位
grep -c "error" file                       # 只告诉你匹配了几行
grep -v "debug" file                       # 排除含 debug 的行
grep -l "pattern" *.log                    # 只列文件名,不显内容
grep -A 3 "error" file                     # 匹配行 + 后面 3 行,看上下文
grep -B 2 "error" file                     # 匹配行 + 前面 2 行
grep -E "err|warn|crit" file               # 一次搜多个词(扩展正则)
grep -P "d{3}-d{4}" file                 # Perl 正则,威力翻倍

02. sed 命令

sed 是个流编辑器,你可以理解成「批量查找替换工具」——不需要打开文件,一键把旧内容换成新内容。处理几十 MB 的日志也不在话下:
bash
sed 's/old/new/' file                     # 每行第一个 old 换成 new
sed 's/old/new/g' file                    # 每行所有 old 全换
sed -i 's/old/new/g' file                 # 直接改原文件,注意没有回头路
sed -i.bak 's/old/new/g' file             # 改之前先备份原文件为 .bak
sed '3d' file                             # 删掉第 3 行
sed '/pattern/d' file                     # 删掉含 pattern 的行
sed '2a
ew line' file                    # 在第 2 行后面插入一行
sed '2i
ew line' file                    # 在第 2 行前面插入一行
sed -n '5,10p' file                       # 只看第 5 到第 10 行
sed 's/^/    /' file                      # 每行前面加 4 个空格(缩进)
sed -i 会直接改写文件,养成加 .bak 后缀的好习惯,万一改错了还能找回原文件。

03. awk 命令

awk 是文本处理界的瑞士军刀——它把每行按空格(或你指定的分隔符)切成一个个字段,然后你可以对这些字段做加减乘除、统计、过滤。相当于命令行的 Excel:
bash
awk '{print $1}' file                     # 打印第 1 列
awk '{print $1, $3}' file                 # 打印第 1 和第 3 列
awk -F: '{print $1}' /etc/passwd          # 用冒号当分隔符
awk '/error/ {print}' file                # 打印含 error 的行
awk 'NR==5' file                          # 只看第 5 行
awk 'NR>=5 && NR<=10' file               # 看第 5 到第 10 行
awk '{sum+=$1} END {print sum}' file      # 第 1 列求和
awk '{print NR, $0}' file                 # 行号 + 内容
awk -F: '$3>=1000 {print $1}' /etc/passwd # 第 3 列 >= 1000 才打印第 1 列
awk '{count[$1]++} END {for(k in count) print k, count[k]}' file  # 统计每项出现次数

04. sort 与 uniq

排序和去重是数据分析的基本功,sort 和 uniq 是绝佳搭档:
bash
sort file                     # 按字母排序
sort -r file                  # 反过来排
sort -n file                  # 按数字大小排(不用 -n 的话 10 会排在 2 前面!)
sort -k2 file                 # 按第 2 列来排
sort -t: -k3 -n /etc/passwd   # 冒号分隔,按第 3 列数字排

sort file | uniq              # 去重(先排序再去重,搭配使用)
sort file | uniq -c           # 去重 + 统计出现次数
sort file | uniq -d           # 只看重复出现的行
sort file | sort | uniq -c | sort -rn  # 词频排行榜

05. 管道与重定向

管道 | 是 Linux 的设计精髓——把前一个命令的输出直接喂给下一个命令的输入,像流水线一样。重定向 > 和 >> 则控制输出去哪儿。这两个概念搞懂了,Linux 功力直接翻倍:
bash
command > file               # 输出写到 file(覆盖原有内容)
command >> file              # 输出追加到 file 末尾
command 2> file              # 只把错误信息写到 file
command &> file              # 不管正常还是错误,全写进去
command < file               # 从 file 读输入

cat file | grep "error" | wc -l    # 数数文件里有多少行带 error
ps aux | grep nginx | grep -v grep # 找 nginx 进程,去掉 grep 自己
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10  # 统计访问最多的 10 个 IP
管道就是把简单命令串成流水线。每个命令只做一件事但做到极致,串起来威力无穷。

知识测验

1/5正确 0

grep -i 选项的作用是?

下一节

用户与权限管理

下一节