Linux 管道和重定向是命令行操作的核心功能,可以实现进程间通信和数据流控制。
标准输入输出:
- 标准输入(stdin,文件描述符 0):默认来自键盘
- 标准输出(stdout,文件描述符 1):默认输出到屏幕
- 标准错误(stderr,文件描述符 2):默认输出到屏幕
- /dev/stdin:标准输入设备
- /dev/stdout:标准输出设备
- /dev/stderr:标准错误设备
重定向操作符:
- 输出重定向:
-
:将标准输出重定向到文件(覆盖)
-
:将标准输出追加到文件
- 2>:将标准错误重定向到文件(覆盖)
- 2>>:将标准错误追加到文件
- &>:将标准输出和标准错误重定向到文件(覆盖)
- &>>:将标准输出和标准错误追加到文件
-
file 2>&1:将标准输出和标准错误都重定向到文件
- 2>&1:将标准错误重定向到标准输出
-
- 输入重定向:
- <:从文件读取输入
- <<:here document,从命令行读取输入直到遇到定界符
- <<<:here string,从字符串读取输入
- 文件描述符重定向:
- n>&m:将文件描述符 n 重定向到文件描述符 m
- n<&m:将文件描述符 n 重定向为文件描述符 m 的副本
- 禁用输出:
-
/dev/null:将输出重定向到空设备(丢弃)
- 2> /dev/null:将错误重定向到空设备(丢弃)
-
管道操作符:
- |:将前一个命令的标准输出作为后一个命令的标准输入
- |&:将前一个命令的标准输出和标准错误作为后一个命令的标准输入
- 管道示例:
- ps aux | grep nginx:查找 nginx 进程
- cat file.txt | grep "pattern" | wc -l:统计匹配行数
- ls -l | awk '{print $5}' | sort -n:按文件大小排序
- find / -name "*.log" 2>/dev/null | xargs grep "error":查找日志中的错误
常用管道命令:
- grep:文本搜索
- awk:文本处理
- sed:流编辑器
- sort:排序
- uniq:去重
- cut:剪切
- head:显示前几行
- tail:显示后几行
- wc:统计行数、字数、字符数
- tee:读取标准输入并写入文件和标准输出
- xargs:从标准输入构建并执行命令
tee 命令:
- tee:读取标准输入,写入文件和标准输出
- 常用选项:
- -a:追加到文件(不覆盖)
- -i:忽略中断信号
- 示例:
- command | tee output.txt:将输出保存到文件并显示在屏幕
- command | tee -a output.txt:将输出追加到文件并显示在屏幕
xargs 命令:
- xargs:从标准输入读取参数并执行命令
- 常用选项:
- -n num:每次使用 num 个参数
- -I str:用 str 替换输入中的参数
- -p:执行前提示确认
- -t:显示执行的命令
- 示例:
- find . -name "*.txt" | xargs rm -f:删除所有 .txt 文件
- echo "file1 file2" | xargs -n 1 cat:逐个显示文件内容
- ls *.jpg | xargs -I {} cp {} /backup/:复制所有 jpg 文件到备份目录
进程替换:
- <(command):将命令的输出作为临时文件
-
(command):将命令的输入作为临时文件
- 示例:
- diff <(sort file1) <(sort file2):比较排序后的文件
- command > >(logger):将输出发送到日志系统
命名管道(FIFO):
- mkfifo:创建命名管道
- 命名管道是文件系统中的特殊文件
- 允许不相关的进程进行通信
- 示例:
- mkfifo mypipe
- cat > mypipe:向管道写入数据
- cat < mypipe:从管道读取数据
实际应用示例:
- 日志分析:
- tail -f /var/log/nginx/access.log | grep "404":实时监控 404 错误
- cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10:统计访问量最高的 IP
- 数据处理:
- cat data.csv | cut -d, -f1 | sort | uniq:提取第一列并去重
- ps aux | awk '{sum+=$3} END {print sum}':计算 CPU 总使用率
- 系统监控:
- vmstat 1 | awk '{print $4}':监控内存使用
- iostat -x 1 | grep -v "^$": 监控磁盘 I/O
- 批量操作:
- find . -type f -name "*.sh" | xargs chmod +x:批量添加执行权限
- cat servers.txt | xargs -I {} ssh {} "uptime":批量查看服务器运行时间
最佳实践:
- 使用管道连接简单命令,构建复杂功能
- 合理使用重定向保存输出结果
- 使用 /dev/null 丢弃不需要的输出
- 使用 tee 同时查看和保存输出
- 使用 xargs 处理大量文件
- 注意管道的缓冲区限制
- 处理错误输出时使用 2>&1 或 |&