基础组合:管道与重定向
这是最常用、最基础的组合方式,它允许你将一个命令的输出作为另一个命令的输入。

管道符
管道符将标准输出 连接到另一个命令的标准输入。
语法:
command1 | command2
工作原理: command1 的正常输出结果不会显示在屏幕上,而是直接“喂”给 command2 作为其输入。
经典示例:

-
查看系统中最占 CPU 的 5 个进程
ps aux --sort=-%cpu | head -n 6
ps aux --sort=-%cpu: 列出所有进程,并按 CPU 使用率降序排序。- 将排序后的进程列表传递给下一个命令。
head -n 6: 只显示前 6 行(第一行是标题,所以是 5 个进程)。
-
统计当前目录下所有文件的数量
ls -l | grep "^-" | wc -l
ls -l: 以长格式列出文件和目录。grep "^-": 过滤出以 开头的行,这些就是普通文件。wc -l: 统计经过过滤后的行数,也就是文件的数量。
-
查找包含 "error" 关键词的日志行,并按错误类型分组统计
grep "error" /var/log/syslog | awk '{print $6}' | sort | uniq -cgrep "error" /var/log/syslog: 从系统日志中筛选出包含 "error" 的行。awk '{print $6}': 提取每行的第 6 列(通常是服务名)。sort: 对提取出的服务名进行排序,为uniq做准备。uniq -c: 合并连续的重复行,并统计每个重复项出现的次数。
重定向符 > 和 >>
重定向符用于将命令的输出(标准输出和标准错误)保存到文件中,而不是显示在屏幕上。

>:覆盖写入,如果文件存在,其内容将被新内容覆盖。>>:追加写入,如果文件存在,新内容将被添加到文件末尾。
经典示例:
-
将当前日期和时间记录到日志文件中
date >> /var/log/my_app.log
- 每次执行都会在
my_app.log文件末尾添加一行新的时间戳。
- 每次执行都会在
-
将错误信息单独保存
find / -name "my_file.txt" 2> errors.log
find / -name "my_file.txt": 在根目录下搜索文件。2> errors.log: 将命令的标准错误 输出到errors.log文件中。2代表文件描述符 2,即标准错误。
-
同时保存标准输出和标准错误
command > output.log 2>&1
command > output.log: 将标准输出重定向到output.log。2>&1: 将标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)当前指向的位置,也就是output.log文件。
进阶组合:控制流与逻辑
分号
使用分号可以顺序执行多个命令,无论前一个命令是否成功执行。
语法:
command1 ; command2 ; command3
示例:
date ; whoami ; echo "This will always run"
- 无论
date或whoami是否成功,echo命令都会执行。
逻辑与 &&
使用 && 可以条件执行,只有当 && 前面的命令返回退出码 0(成功)时,&& 后面的命令才会执行。
语法:
command1 && command2
示例:
# 确保文件存在后再编辑它 ls /etc/passwd && vim /etc/passwd # 创建目录并进入(如果目录已存在,mkdir 会失败,cd 不会执行) mkdir -p my_dir && cd my_dir
逻辑或
使用 可以条件执行,只有当 前面的命令返回非零退出码(失败)时, 后面的命令才会执行。
语法:
command1 || command2
示例:
# 如果文件不存在,则创建它 ls /etc/non_existent_file || touch /etc/non_existent_file # 尝试删除一个文件,如果失败(例如没有权限)则提示用户 rm /protected_file || echo "Permission denied. Cannot delete the file."
组合使用 && 和
这是实现 if-then-else 逻辑的简洁方式。
语法:
command1 && command_on_success || command_on_failure
示例:
# 尝试删除文件,如果成功则提示 "Deleted",否则提示 "Not found" rm /tmp/test.txt && echo "Deleted successfully." || echo "File not found or permission denied."
- 注意: 这种写法在
command1成功时,command_on_failure不会执行,但如果command1失败,command_on_success会被跳过,command_on_failure会执行。
高级组合:命令替换与进程处理
命令替换 ` 或 `$()**
命令替换允许你将一个命令的输出结果作为另一个命令的参数或输入,推荐使用 ,因为它更易于嵌套和阅读。
语法:
command1 $(command2) 或 command1command2``
示例:
-
进入刚刚创建的目录
cd $(mktemp -d)
mktemp -d: 创建一个临时目录并返回其路径。cd $(...): 将返回的路径作为cd命令的参数。
-
批量重命名文件(将所有
.txt文件改为.md)for f in *.txt; do mv "$f" "${f%.txt}.md"; done- 这里的
${f%.txt}也是一种参数扩展,但命令替换的思想是类似的。
- 这里的
子 shell
将一组命令放在括号 中,这组命令会在一个子 shell 中执行,子 shell 会继承父 shell 的环境变量,但对其的修改(如 cd、export)不会影响父 shell。
语法:
( command1; command2; command3 )
示例:
# 在子 shell 中切换目录,不影响当前 shell ( cd /var/log && ls -l ) # 父 shell 的当前工作目录没有改变 pwd
后台运行 &
在命令末尾加上 &,可以让命令在后台运行,立即返回终端,让你可以继续输入其他命令。
语法:
command &
示例:
# 在后台启动一个 Web 服务器 python3 -m http.server 8000 & # 你可以继续做其他事情 echo "Server is running in the background..."
终极组合:xargs
xargs 是一个强大的工具,它能够将标准输入转换成命令行参数,它非常适合与管道配合使用,处理那些不能直接通过管道接收输入的命令。
经典示例:
-
查找所有
.log文件并删除它们find . -name "*.log" -type f | xargs rm
find . -name "*.log" -type f: 在当前目录及其子目录下查找所有.log文件。| xargs rm:xargs会读取find的输出(文件列表),并将其作为参数传递给rm命令。
-
使用
xargs的-I选项,为每个文件执行不同的操作find . -name "*.txt" | xargs -I {} sh -c 'echo "Processing {}"; wc -l {}'-I {}: 告诉xargs将从标准输入读取的每一行内容替换到命令中的 占位符。sh -c '...': 启动一个新的 shell 来执行复杂的命令,这里我们为每个文件打印一条消息并统计其行数。
-
处理文件名中包含空格的情况
find . -print0 | xargs -0 rm
find . -print0: 使用\0(null字符) 作为分隔符来输出文件名,这能正确处理任何特殊字符,包括空格和换行符。xargs -0: 告诉xargs使用\0作为分隔符来读取输入。
总结与最佳实践
| 组合方式 | 符号 | 作用 | 示例 |
|---|---|---|---|
| 管道 | 连接命令,将前一个命令的输出作为后一个命令的输入 | ps aux \| grep nginx |
|
| 覆盖重定向 | > |
将命令的输出覆盖写入文件 | ls > file_list.txt |
| 追加重定向 | >> |
将命令的输出追加写入文件 | echo "log" >> app.log |
| 顺序执行 | 按顺序执行多个命令,无论前一个是否成功 | date ; whoami |
|
| 逻辑与 | && |
前一个命令成功时,才执行后一个命令 | git pull && make install |
| 逻辑或 | 前一个命令失败时,才执行后一个命令 | command \| \| echo "Failed" |
|
| 命令替换 | 将一个命令的输出作为另一个命令的参数 | echo "Today is $(date)" |
|
| 后台运行 | & |
在后台运行一个命令 | sleep 100 & |
| 参数传递 | xargs |
将标准输入转换为命令行参数 | find . -name "*.tmp" \| xargs rm |
最佳实践:
- 可读性优先:如果命令过长,考虑使用反斜杠
\换行,或者将其写入一个 shell 脚本中。 - 使用 而不是反引号: 更易于嵌套和转义,是现代 Shell 脚本的首选。
- 小心处理文件名:当文件名可能包含空格、换行符等特殊字符时,优先使用
find -print0和xargs -0的组合。 - 善用
&&和 :它们能让你的脚本更健壮,实现条件逻辑。 - 从简单开始:先构建单个命令,确保它能正常工作,然后再通过管道或重定向将其组合起来。
掌握这些组合命令的技巧,你的 Linux 使用效率将得到质的飞跃。
