在Linux系统中,过滤行是文本处理的核心操作,无论是系统日志分析、数据清洗还是代码提取,都需要从大量文本中精准提取目标行,本文将详细介绍grep、sed、awk、cut、sort等工具的过滤方法,并结合实例说明其应用场景。

grep:基于正则表达式的行过滤工具
grep(Global Regular Expression Print)是最常用的文本过滤工具,支持正则表达式匹配,能够快速筛选包含特定模式的行。
核心功能与常用选项
- 基本用法:
grep [选项] '模式' 文件名,默认输出包含模式的行。 - 常用选项:
| 选项 | 功能 | 示例 |
|——|——|——|
|-i| 忽略大小写 |grep -i 'error' log.txt(匹配Error、ERROR等) |
|-v| 反向匹配(输出不包含模式的行) |grep -v 'info' log.txt(过滤非info行) |
|-c| 统计匹配行数 |grep -c 'warning' log.txt(统计warning出现次数) |
|-n| 显示匹配行号 |grep -n '192.168' access.log(显示IP所在行号) |
|-E| 支持扩展正则表达式 |grep -E 'error|critical' log.txt(匹配error或critical) |
实例应用
- 过滤系统日志中的错误信息:
grep -i 'error' /var/log/syslog - 提取访问日志中的特定IP:
grep '192.168.1.100' /var/log/nginx/access.log - 统计某状态码的出现次数:
grep -c '404' /var/log/nginx/access.log
sed:流编辑器的行过滤与替换
sed(Stream Editor)擅长按行处理文本,通过“地址+命令”的模式实现过滤、删除、替换等操作。
核心功能与常用命令
- 基本用法:
sed [选项] '地址命令' 文件名,默认不修改原文件(需加-i直接修改)。 - 常用命令:
| 命令 | 功能 | 示例 |
|——|——|——|
|p| 打印匹配行(需配合-n取消默认输出) |sed -n '/^#/p' config.txt(打印注释行) |
|d| 删除匹配行 |sed '/^$/d' data.txt(删除空行) |
| | 打印行号 |sed -n '/error/=' log.txt(显示error所在行号) |
选项与实例
- 选项:
-n:取消默认输出,仅显示匹配命令处理的行。-i:直接修改文件(慎用,建议先备份)。
- 实例:
- 过滤并打印包含“warning”的行:
sed -n '/warning/p' log.txt - 删除以“#”开头的注释行:
sed '/^#/d' config.txt - 反向过滤(删除包含“error”的行):
sed '/error/d' log.txt
- 过滤并打印包含“warning”的行:
awk:基于字段与模式的强大文本分析工具
awk以其强大的字段处理能力著称,支持按列分析、条件判断和复杂计算,适合多列数据的过滤。

核心概念与语法
- 基本语法:
awk '条件{动作}' 文件名,默认以空格/制表符分隔字段($1、$2表示列)。 - 常用功能:
- 正则表达式匹配:
/pattern/ - 条件判断:
$1 > 100(第一列大于100)、$2 == "active"(第二列为active) - 内置函数:
length($0)(行长度)、substr($1,1,3)(截取字段)
- 正则表达式匹配:
实例应用
- 过滤CSV文件中“status”列为“success”的行:
awk -F ',' '$3 == "success" data.csv(-F指定分隔符) - 提取访问日志中响应时间大于1000ms的行:
awk '$10 > 1000 {print $1, $9}' access.log($1为IP,$9为响应时间) - 统计每个IP的访问次数:
awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' access.log
cut:按列切割的行过滤工具
cut适合按分隔符或字符位置提取特定列,常与grep配合实现列过滤。
核心功能与选项
- 基本用法:
cut [选项] 文件名 - 常用选项:
| 选项 | 功能 | 示例 |
|——|——|——|
|-d| 指定字段分隔符(默认为制表符) |cut -d ',' -f 1,3 data.csv(提取第1、3列) |
|-f| 指定列号(1-3表示1到3列,1,3表示第1、3列) |cut -d ':' -f 1,6 /etc/passwd(提取用户名和家目录) |
|-c| 按字符切割(1-5表示1到5个字符) |cut -c 1-10 file.txt(提取每行前10个字符) |
实例
- 提取CSV文件的第2列并过滤包含“test”的行:
cut -d ',' -f 2 data.csv | grep 'test' - 提取/etc/passwd中的用户名(第1列)和UID(第3列):
cut -d ':' -f 1,3 /etc/passwd
sort与uniq:排序与去重的行过滤
sort用于排序,uniq用于去重,两者结合可高效处理重复行或统计频率。
sort选项
| 选项 | 功能 | 示例 |
|---|---|---|
-n |
数字排序(默认按字符排序) | sort -n numbers.txt |
-r |
反向排序 | sort -rn access.log(按访问量降序) |
-k |
按指定列排序 | sort -t ',' -k 3 data.csv(按第3列升序) |
uniq选项
| 选项 | 功能 | 示例 |
|---|---|---|
-d |
仅显示重复行 | sort file.txt | uniq -d |
-u |
仅显示唯一行 | sort file.txt | uniq -u |
-c |
统计重复次数 | sort file.txt | uniq -c |
实例
- 统计访问日志中IP的访问次数:
sort access.log | awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' | sort -rn - 去重并显示唯一行:
sort data.txt | uniq -u
工具对比与选择建议
| 工具 | 主要功能 | 适用场景 |
|---|---|---|
| grep | 正则表达式行过滤 | 简单模式匹配、关键词提取 |
| sed | 流编辑(删除/替换/打印) | 需要修改行内容或删除特定行 |
| awk | 字段处理与复杂分析 | 多列数据过滤、条件判断、统计计算 |
| cut | 按列切割 | 提取固定列数据(如CSV、日志列) |
| sort+uniq | 排序与去重 | 统计频率、去重处理 |
相关问答FAQs
问题1:如何过滤出文件中同时包含“error”和“timeout”的行?
解答:使用grep的扩展正则表达式或管道组合。

- 方法1(扩展正则):
grep -E 'error.*timeout|timeout.*error' file.txt - 方法2(管道组合):
grep 'error' file.txt | grep 'timeout'
问题2:如何过滤出文件中长度大于80字符的行?
解答:使用awk的length()函数或sed的正则表达式。
- 方法1(awk):
awk 'length($0) > 80' file.txt - 方法2(sed):
sed -n '/^.{80}/p' file.txt(^.匹配任意字符,{80}表示80次)
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/24361.html