命名管道吞下 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
循环?
为什么需要awk
? df -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 命令输出的第一个字段的主要内容,如果未能解决你的问题,请参考以下文章