核心筛选命令
这些是筛选命令的基石,每个命令都有其独特的用途。

grep - 文本搜索
grep (Global Regular Expression Print) 是最强大的文本搜索工具,它使用正则表达式来匹配文本。
基本语法:
grep [选项] '模式' 文件名...
常用选项:
-i: 忽略大小写。-v: 反向选择,即打印不匹配的行。-n: 显示匹配行的行号。-c: 只输出匹配行的总数。-E: 使用扩展正则表达式。-w: 匹配整个单词。-r或-R: 递归搜索目录下的所有文件。
示例:

# 1. 在文件中搜索包含 "error" 的行,并显示行号 grep -n 'error' system.log # 2. 搜索不包含 "warning" 的行 grep -v 'warning' system.log # 3. 在当前目录及其子目录中,递归搜索所有文件里包含 "TODO" 的行(忽略大小写) grep -ri 'todo' . # 4. 统计 "login" 关键词出现的次数 grep -c 'login' auth.log
sed - 流编辑器
sed (Stream Editor) 可以对输入的文本流进行编辑,如查找、替换、删除、插入等,它擅长对文本进行修改。
基本语法:
sed [选项] '命令' 文件名...
常用命令:
s/旧文本/新文本/g: 全局替换。d: 删除匹配的行。p: 打印匹配的行(通常与-n选项一起使用)。a\文本: 在匹配行后追加文本。i\文本: 在匹配行前插入文本。
常用选项:

-n: 静默模式,只打印被p命令处理的行。-e: 允许在命令行中执行多个编辑命令。
示例:
# 1. 将文件中的 "old" 替换为 "new" sed 's/old/new/g' filename.txt # 2. 删除所有包含 "temp" 的行 sed '/temp/d' filename.txt # 3. 只打印包含 "192.168.1" 的行(-n 和 p 配合使用) sed -n '/192.168.1/p' /var/log/nginx/access.log # 4. 在文件的第5行后插入一行新文本 "This is a new line" sed '5a\This is a new line' filename.txt
awk - 文本处理工具
awk 是一个功能极其强大的报告生成工具,它逐行扫描文件,并将每行拆分为多个字段(默认以空格或制表符分隔)进行处理,它擅长基于列进行筛选和计算。
基本语法:
awk [选项] '条件 {动作}' 文件名...
条件: 可以是正则表达式、比较表达式(如$1 > 100)等。动作: 可以是print,printf, 算术运算等。$0: 代表整行。$1, $2, ...: 代表第一个字段、第二个字段,以此类推。
常用选项:
-F: 指定字段分隔符,如-F:,-F,。
示例:
# 假设 /etc/passwd 文件,字段由 ':' 分隔
# 1. 打印第1列(用户名)和第6列(家目录)
awk -F: '{print $1, $6}' /etc/passwd
# 2. 打印第3列(UID)大于1000的用户名和UID
awk -F: '$3 > 1000 {print $1, $3}' /etc/passwd
# 3. 打印包含 "/bin/bash" 的行的第1列
awk -F: '/\/bin\/bash/ {print $1}' /etc/passwd
# 4. 计算文件中第三列的总和
awk '{sum += $3} END {print sum}' data.txt
sort - 排序
sort 命令用于对文本文件的行进行排序。
常用选项:
-n: 按数值大小排序(默认是按字符排序)。-r: 反向排序(降序)。-k: 指定按哪一列进行排序。-t: 指定字段分隔符。-u: 去除重复的行。
示例:
# 1. 对文件内容按默认方式(字典序)排序 sort filename.txt # 2. 按第三列的数值进行排序 sort -n -k3 filename.txt # 3. 按第二列的反向(降序)排序 sort -r -k2 filename.txt # 4. 对文件内容排序并去除重复行 sort -u filename.txt
uniq - 去重
uniq 通常与 sort 结合使用,用于相邻行的去重,它必须先对文件进行排序。
常用选项:
-i: 忽略大小写。-d: 只显示重复的行。-u: 只显示不重复的行。
示例:
# 1. 先排序,再去除相邻的重复行 sort filename.txt | uniq # 2. 统计每一行出现的次数 sort filename.txt | uniq -c # 3. 只显示那些在文件中出现超过一次的行 sort filename.txt | uniq -d
cut - 切割列
cut 用于从文本行中提取特定的列或字符。
常用选项:
-d: 指定字段分隔符。-f: 指定要提取的字段(列)。-c: 按字符切割,而不是按字段。
示例:
# 假设文件内容用逗号分隔 # 1. 提取第1列和第3列 cut -d',' -f1,3 data.csv # 2. 提取第2到第4个字符 echo "abcdef" | cut -c2-4
命令组合与管道
真正的威力在于将它们组合起来,管道符 是连接它们的灵魂。
组合模式:命令1 | 命令2 | ... | 命令N
cat file.txt | ...: 将文件内容作为标准输入传递给下一个命令。command | ...: 将一个命令的输出作为另一个命令的输入。
示例组合:
# 场景:从系统日志中,找出 "ERROR" 级别的日志,并按时间排序,统计每种错误出现的次数 cat /var/log/syslog | grep 'ERROR' | sort | uniq -c | sort -nr # 解读: # 1. cat /var/log/syslog: 读取日志文件 # 2. | grep 'ERROR': 筛选出包含 "ERROR" 的行 # 3. | sort: 对错误行进行排序,为 uniq 做准备 # 4. | uniq -c: 统计每个错误出现的次数 # 5. | sort -nr: 按数字(-n)降序(-r)排列,显示最常见的错误
实战案例
假设我们有一个 web_access.log 文件,内容如下:
168.1.100 - - [10/Oct/2025:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 2326
192.168.1.101 - - [10/Oct/2025:13:56:01 +0800] "POST /login HTTP/1.1" 200 512
10.0.0.5 - - [10/Oct/2025:13:56:15 +0800] "GET /admin/dashboard HTTP/1.1" 404 1024
192.168.1.100 - - [10/Oct/2025:13:57:10 +0800] "GET /images/logo.png HTTP/1.1" 200 15432
10.0.0.5 - - [10/Oct/2025:13:57:45 +0800] "GET /robots.txt HTTP/1.1" 404 1024
案例1:找出所有访问 /admin/dashboard 的IP地址
grep '/admin/dashboard' web_access.log | awk '{print $1}'
# 输出:
# 10.0.0.5
案例2:找出所有状态码为 404 的请求,并统计每个IP的404次数
grep ' 404 ' web_access.log | awk '{print $1}' | sort | uniq -c
# 输出:
# 2 10.0.0.5
案例3:找出所有访问量最大的IP地址(总访问次数)
awk '{print $1}' web_access.log | sort | uniq -c | sort -nr | head -n 1
# 输出:
# 2 192.168.1.100
案例4:将日志按IP地址分组,并显示每个IP的首次访问时间
# 这是一个更复杂的awk脚本
awk '{ips[$1]++; first_time[$1] = $4} END {for (ip in ips) print ip, "访问次数:", ips[ip], "首次访问:", first_time[ip]}' web_access.log
# 输出(顺序可能不同):
# 192.168.1.100 访问次数: 2 首次访问: [10/Oct/2025:13:55:36
# 192.168.1.101 访问次数: 1 首次访问: [10/Oct/2025:13:56:01
# 10.0.0.5 访问次数: 2 首次访问: [10/Oct/2025:13:56:15
| 命令 | 主要用途 | 核心特点 |
|---|---|---|
grep |
搜索 | 根据模式匹配行,功能强大,正则表达式支持好。 |
sed |
编辑 | 修改文本,擅长替换、删除、插入。 |
awk |
处理/报告 | 按列处理,支持编程逻辑,功能最强大。 |
sort |
排序 | 对行进行排序,可指定列和分隔符。 |
uniq |
去重 | 去除相邻的重复行,通常配合 sort 使用。 |
cut |
切割 | 简单地按列或字符提取数据。 |
掌握这些命令,并学会用 将它们串联起来,你就能像使用瑞士军刀一样,高效地处理任何文本数据。
