乐闻世界logo
搜索文章和话题

Linux 管道和重定向的使用方法和常见场景有哪些?

2月17日 23:36

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 或 |&
标签:Linux