「Linux 系统编程」grep、xargs

1 grep

1.1 grep 命令语法

grep 用于在 文件输入流 中查找 匹配指定模式 的内容。

1
grep [选项] 模式 [文件]
  • -i:忽略大小写,不区分大小写匹配
  • -n:显示匹配行的行号
  • -v:反向匹配,显示不包含模式的行
  • -r-R:递归搜索,在目录及其子目录的所有文件中查找
  • -w:匹配整个单词,而不是单词的一部分


1.2 grep 命令示例

示例:

1
grep "marisa" a.cpp  # 查找 a.cpp 包含 marisa 的内容


1
2
# 查找 a.cpp 包含 polygon 的内容(忽略大小写、输出行号)
grep -i -n "polygon" a.cpp



1.3 结合 ps 使用

grep 也可以结合 ps aux 命令以及管道使用。ps 监控后台进程工作情况,默认只显示当前可以和用户交互的进程。

  • a:显示所有用户的进程(包括其他用户的进程)
  • u:以用户为中心的格式显示(包含用户名、CPU 占用率等详细信息)
  • x:显示没有控制终端的进程(如后台运行的进程)

示例:

1
ps aux | grep "loop"  # 查找与 loop 相关的进程


1
ps aux | grep "alice"  # 查找与 alice 相关的进程

使用 grep 搜索进程,有一条结果是搜索进程本身



2 xargs

2.1 xargs 命令语法

xargs 主要功能是将标准输入的数据转换为命令的参数,通常与管道(|)结合使用,处理前一个命令的输出结果。

1
命令1 | xargs [选项] 命令2

xargs 会将 命令1 的输出作为参数传递给 命令2。



2.2 xargs 命令示例

示例:

1
2
# 找到当前目录下所有 .cpp 文件,然后显示其所有详细信息
find ./ -name "*.cpp" | xargs ls -lh

可以看出 find ./ -name "*.cpp" | xargs ls -lh 命令和 find ./ -name "*.cpp" -exec ls -lh {} \; 的效果是一样的。

当查找结果集合较大时,xargs 会对结果进行 分段处理较为高效



2.3 配合 find 安全删除文件

xargs 默认用 空格 来分割结果集。当文件名有空格的时候,会因为文件名被切割失效:


此时需要以 null 字符作为分隔符,来处理含空格 / 特殊字符的文件名。然而在 find 中默认会选择 -print 选项(用换行符分隔路径)。

-print 这种输出传递给 xargs 时,空格和换行符都会被视为分隔符,进而导致带空格的文件被错误拆分。

因此,需要在 find 命令中添加参数 -print0用 null 空字符 \0 分隔),这样空格和换行符会被保留。通常结合 xargs -0 使用,用于 读取 \0 分隔的输入,正确传递每个完整文件名。

1
find ./ -type f -print0 | xargs -0 ls -lh
  • -print0:让 find 输出以 null 空字符分隔(处理含空格的文件名)
  • -0:让 xargs 识别 null 分隔符


「Linux 系统编程」grep、xargs
https://marisamagic.github.io/2025/08/06/20250806/
作者
MarisaMagic
发布于
2025年8月6日
许可协议