在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