命名管道吞下 Linux 命令输出的第一个字段

Posted

技术标签:

【中文标题】命名管道吞下 Linux 命令输出的第一个字段【英文标题】:Named pipe swallowing first field of Linux command output 【发布时间】:2021-08-06 16:23:47 【问题描述】:

我正在尝试解析 Linux df 工具的输出以用于机器状态报告。我使用几乎相同的代码来解析 ps 工具的输出,它工作正常(所有字段在读取循环中都可用)但是在下面的代码中,当我从命名的读取时,awk 的第一个字段输出(percentUsed)丢失了管道。

#!/bin/sh

mkfifo dfPipe0
IFS=" "
df -h | awk ' print $6" "$3" "$7" "$1 ' > dfPipe0 &
while read -r percentUsed size mountedOn fileSystem
do
  printf "%s\n" "$percentUsed | $size | $mountedOn | $fileSystem"
done < dfPipe0
rm dfPipe0

示例 df + awk 输出

$ df -h | awk ' print $6" "$3" "$7" "$1 '
Use% Size Mounted Filesystem
0% 1.9G /dev devtmpfs
- 0 /sys/kernel/security securityfs
4% 1.9G /dev/shm tmpfs
$

【问题讨论】:

为什么要使用命名管道而不是仅仅通过管道连接到while 循环? 为什么需要awkdf -h | while read -r filesystem size used avail percentUsed mountedOn 检查您的脚本以确保其中没有 \r 字符。 请包含第一个脚本的输出。 fwiw ...我将df/awk 输出(来自问题)转换为dfPipe0,并且提供的代码按预期工作(即,没有丢失字段) 【参考方案1】:

我编辑了我的代码以使用@Barmar 的标准管道建议,它解决了我的问题。下面的代码运行良好。

df -h | \
while read -r fileSystem size used avail percentUsed mountedOn
do  printf "%s\n" "$fileSystem | $size | $used | $avail | $percentUsed | $mountedOn"
done

【讨论】:

以上是关于命名管道吞下 Linux 命令输出的第一个字段的主要内容,如果未能解决你的问题,请参考以下文章

linux命令命名管道(mkfifo)+ 结合xargs命令使用

Linux进程间通信-命名管道

Linux进程间通信

未在 Tornado 中接收所有命名管道输出

将 ffmpeg 输出通过管道传输到命名管道

Linux进程间通信之管道(pipe)命名管道(FIFO)与信号(Signal)