【问题标题】:Named pipe swallowing first field of Linux command output命名管道吞下 Linux 命令输出的第一个字段
【发布时间】: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,并且提供的代码按预期工作(即,没有丢失字段)

标签: bash scripting named-pipes


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 2012-06-18
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2010-09-18
    • 2021-10-24
    相关资源
    最近更新 更多