菜鸟科技网

Linux筛选命令有哪些常用技巧?

核心思想:一切皆文本

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

Linux筛选命令有哪些常用技巧?-图1
(图片来源网络,侵删)

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)

Linux筛选命令有哪些常用技巧?-图2
(图片来源网络,侵删)
# 显示匹配行的行号
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)

Linux筛选命令有哪些常用技巧?-图3
(图片来源网络,侵删)
# 只输出包含 '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(处理文件后执行)或正则表达式。
  • {动作}:通常是 printprintf 等命令。

常用示例

打印特定列

# 打印 /etc/passwd 的第1列和第7列,用制表符 \t 分隔
# $0 代表整行, $1 代表第1列, $2 代表第2列, 以此类推
awk -F':' '{print $1 "\t" $7}' /etc/passwd

使用 BEGINEND

# 在处理前打印标题,处理后打印总结
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

命令分解:

  1. grep "$(date '+%b %d')" /var/log/access.log:筛选出今天(格式如 Oct 26)的日志。
  2. awk '{print $1}':提取每行的第一个字段(通常是IP地址)。
  3. sort:对IP地址进行排序,这是 uniq 去重的前提。
  4. uniq -c:统计每个相邻的IP地址出现的次数。
  5. sort -nr:按数字(-n)逆序(-r)排序,这样访问量最高的就在最前面。
  6. 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 下的文本数据任务。

分享:
扫描分享到社交APP
上一篇
下一篇