shell管道笔记
Shell 管道与输入输出重定向
Shell 中的管道和重定向是强大的工具,用于控制命令的输入和输出流。
管道(|)
管道将一个命令的输出作为另一个命令的输入。例如,将 ls
的输出传递给 grep
进行过滤:
ls -l | grep ".txt"
管道可以串联多个命令:
cat file.txt | grep "error" | sort | uniq
输出重定向
输出重定向分为标准输出(stdout)和标准错误(stderr)。
将标准输出重定向到文件(覆盖):
ls > output.txt
将标准输出重定向到文件(追加):
ls >> output.txt
将标准错误重定向到文件:
command 2> error.log
同时将 stdout 和 stderr 重定向到文件:
command &> output.log
输入重定向
输入重定向将文件内容作为命令的输入:
grep "pattern" < input.txt
重定向与管道结合
可以将重定向与管道结合使用:
grep "error" < input.txt | sort > output.txt
特殊文件描述符
Shell 使用文件描述符管理输入输出:
- 0:标准输入(stdin)
- 1:标准输出(stdout)
- 2:标准错误(stderr)
将 stderr 合并到 stdout:
command 2>&1
Here Document
Here Document 用于向命令提供多行输入:
cat <<EOF
This is line 1
This is line 2
EOF
Here String
Here String 用于向命令提供字符串作为输入:
grep "foo" <<< "foo bar baz"
管道与重定向的优先级
重定向的优先级高于管道,因此需要注意顺序:
command1 | command2 > output.txt # 正确
command1 > output.txt | command2 # 错误
实用示例
查找特定进程并杀死:
ps aux | grep "nginx" | awk '{print $2}' | xargs kill
统计文件行数并排序:
wc -l *.txt | sort -n
将命令输出保存到变量:
files=$(ls)
注意事项
- 管道会创建子shell,因此变量赋值可能不会影响父shell
- 某些命令(如
cd
)在子shell中执行不会影响当前shell - 过度使用管道可能导致性能问题,应考虑使用临时文件或优化命令