核心思想:一切皆文本
在 Linux/Unix 系统中,几乎所有命令的输出都是纯文本,这使得我们可以使用一套统一的工具来处理它们,无论是文件内容、系统信息还是网络数据。

grep:文本搜索之王
grep (Global Regular Expression Print) 是最基础的筛选命令,用于在文本中搜索匹配指定模式的行。
基本语法
grep [选项] '模式' 文件名
常用选项和示例
基础搜索
# 在 /etc/passwd 文件中搜索包含 'root' 的行 grep 'root' /etc/passwd # 在多个文件中搜索 grep 'error' /var/log/syslog /var/log/auth.log
忽略大小写 (-i)
# 搜索 'user',无论大小写 grep -i 'user' /etc/passwd
显示行号 (-n)

# 显示匹配行的行号 grep -n 'nologin' /etc/passwd
反向匹配 (-v)
# 显示不包含 'nologin' 的行(即可以登录的用户) grep -v 'nologin' /etc/passwd
使用正则表达式
# 搜索以 'ss' 开头的行
grep '^ss' /etc/passwd
# 搜索以 'bash' 结尾的行
grep 'bash$' /etc/passwd
# 搜索包含 4 个连续数字的行
grep '[0-9]\{4\}' some_file.txt
递归搜索目录 (-r 或 -R)
# 在当前目录及其子目录的所有文件中搜索 'TODO' grep -r 'TODO' .
只显示文件名 (-l)

# 只输出包含 'error' 的文件名,不显示具体内容 grep -l 'error' /var/log/*.log
cut:按列切割
cut 用于从文本行中提取特定的列(字段),通常以空格、Tab 或其他分隔符为界。
基本语法
cut [选项] [文件名]
常用选项和示例
按字节切割 (-b)
# 提取每行的第 1 到 3 个字节 echo "hello world" | cut -b 1-3 # 输出: hel
按字符切割 (-c)
# 提取每行的第 1, 3, 5 个字符 echo "hello world" | cut -c 1,3,5 # 输出: hlo
按分隔符切割 (-d 和 -f)
这是 cut 最常用的功能。
# /etc/passwd 文件以冒号 ':' 分隔 # 提取用户名(第1列)和登录Shell(第7列) cut -d':' -f1,7 /etc/passwd # 提取用户名(第1列)和UID(第3列) cut -d':' -f1,3 /etc/passwd # 提取除了第2列(密码)之外的所有列 cut -d':' --complement -f2 /etc/passwd
sort:排序
sort 用于对文本行进行排序,它可以按数字、字母、月份等多种方式排序。
基本语法
sort [选项] [文件名]
常用选项和示例
基础排序
# 对 /etc/passwd 文件按第1列(用户名)进行排序 sort -t':' -k1 /etc/passwd
数字排序 (-n)
# 按数字大小排序 echo -e "5\n10\n2\n20" | sort -n # 输出: 2, 5, 10, 20
默认是字典序,10 会排在 2 前面。
逆序排序 (-r)
# 按用户名逆序排序 sort -t':' -k1 -r /etc/passwd
忽略大小写 (-f)
echo -e "apple\nBanana\ncherry" | sort -f # 输出: apple, Banana, cherry
按特定列排序 (-k)
# /etc/passwd 按 UID(第3列)排序 sort -t':' -k3n /etc/passwd
uniq:去重
uniq 用于从已排序的文本中移除相邻的、重复的行,如果行没有排序,uniq 可能无法达到预期效果。
基本语法
uniq [选项] [输入文件] [输出文件]
常用选项和示例
基础去重
# 先排序,再去重,这是常见用法 sort some_file.txt | uniq
只显示重复的行 (-d)
sort some_file.txt | uniq -d
显示不重复的行 (-u)
sort some_file.txt | uniq -u
统计每行出现的次数 (-c)
sort some_file.txt | uniq -c # 输出: # 3 apple # 1 banana # 2 cherry
awk:强大的文本分析工具
awk 是一个完整的文本处理语言,功能极其强大,它按行处理文本,并可以按列提取、计算、格式化输出。
基本语法
awk [选项] '模式 {动作}' [文件名]
模式:通常是BEGIN(处理文件前执行)、END(处理文件后执行)或正则表达式。{动作}:通常是print、printf等命令。
常用示例
打印特定列
# 打印 /etc/passwd 的第1列和第7列,用制表符 \t 分隔
# $0 代表整行, $1 代表第1列, $2 代表第2列, 以此类推
awk -F':' '{print $1 "\t" $7}' /etc/passwd
使用 BEGIN 和 END
# 在处理前打印标题,处理后打印总结
awk -F':' '
BEGIN {print "User\tShell";}
{print $1 "\t" $7;}
END {print "-----\nEnd of report."}' /etc/passwd
使用条件判断
# 只打印 UID 大于 1000 的用户
awk -F':' '$3 > 1000 {print $1}' /etc/passwd
计算总和
# 计算第三列(UID)的总和
awk -F':' '{sum += $3} END {print "Total UID sum:", sum}' /etc/passwd
sed:流编辑器
sed 主要用于对文本进行编辑(替换、删除、插入等),而不是筛选,但它常与筛选命令结合使用。
常用示例
替换文本
# 将 'root' 替换为 'admin',注意 -i 会直接修改文件,不加 -i 只在屏幕显示 sed 's/root/admin/g' /etc/passwd
删除行
# 删除包含 'nologin' 的行 sed '/nologin/d' /etc/passwd
打印特定行
# 打印第 10 行 sed -n '10p' /etc/passwd # 打印第 10 到 20 行 sed -n '10,20p' /etc/passwd
wc:统计行、字、字节
wc 用于统计文件的行数、单词数和字节数。
常用选项和示例
# 统计 /etc/passwd 的行数、单词数和字节数 wc /etc/passwd # 输出: 43 100 2135 /etc/passwd # 只统计行数 wc -l /etc/passwd # 只统计单词数 wc -w /etc/passwd # 只统计字节数 wc -c /etc/passwd
综合实例:命令管道的艺术
这些命令的真正威力在于通过 (管道)连接起来。
场景:从系统日志中找出今天访问次数最多的前10个IP地址。
# 1. 查看今天的日志 (grep)
# 2. 提取IP地址 (awk)
# 3. 排序 (sort)
# 4. 统计每个IP出现的次数 (uniq)
# 5. 按次数逆序排序 (sort)
# 6. 只显示前10名 (head)
grep "$(date '+%b %d')" /var/log/access.log | \
awk '{print $1}' | \
sort | \
uniq -c | \
sort -nr | \
head -n 10
命令分解:
grep "$(date '+%b %d')" /var/log/access.log:筛选出今天(格式如Oct 26)的日志。awk '{print $1}':提取每行的第一个字段(通常是IP地址)。sort:对IP地址进行排序,这是uniq去重的前提。uniq -c:统计每个相邻的IP地址出现的次数。sort -nr:按数字(-n)逆序(-r)排序,这样访问量最高的就在最前面。head -n 10:只显示排序后的前10行。
总结表格
| 命令 | 主要功能 | 常用选项 | 核心思想 |
|---|---|---|---|
grep |
文本搜索 | -i, -n, -v, -r |
模式匹配,筛选出符合条件的行 |
cut |
按列切割 | -d, -f, -b, -c |
按分隔符或位置提取列 |
sort |
排序 | -n, -r, -k |
对行进行重新排序 |
uniq |
去重 | -c, -d, -u |
移除相邻的重复行 |
awk |
文本分析 | -F |
按行和列进行复杂处理和计算 |
sed |
流编辑 | s/.../.../g, d, p |
对文本进行替换、删除等修改 |
wc |
统计 | -l, -w, -c |
统计行数、单词数、字节数 |
掌握这些命令并熟练使用管道,你就能高效地处理绝大多数 Linux 下的文本数据任务。
