如何在 xargs 中截断尾随 space

How to truncate trailing space in xargs

我想根据命令 A 的输出使用 xargs 列出一些文件的内容。 Xargs replace-str 似乎在末尾添加 space 并导致命令失败。有什么建议么?我知道这可以通过使用 for 循环来解决。但是很想知道如何使用 xargs 来做到这一点。

lsscsi |awk -F\/ '/ATA/ {print $NF}' | xargs -L 1 -I % cat /sys/block/%/queue/scheduler
cat: /sys/block/sda /queue/scheduler: No such file or directory
lsscsi |awk -F\/ '/ATA/ {print $NF}'| awk '{print $NF}' | xargs -L 1 -I % cat /sys/block/%/queue/scheduler

第一个 awk stmt 以“/”分隔,因此其他任何内容都被视为字段。在这种情况下,"sda " 变成整个字段,最后包括 space。但默认情况下,awk 会删除 space 。因此,在管道之后,第二个 awk 打印 $NF(这是该行的最后一个字)并省略“” space 作为分隔符。 awk { print $1 } 会做同样的事情,因为我们只有一个词,"sda",它既是第一个又是最后一个。

问题是 not with xargs -Inot 将 space 附加到每个参数,可验证如下:

$ echo 'sda' | xargs -I % echo '[%]'
[sda]

顺便说一句,在 加法 -I 中指定 -L 1 是没有意义的:-I 意味着 逐行处理。

因此,它必须是向 xargs 提供输入的命令的输出,其中包含结尾的 space.
您可以调整 awk 命令来解决这个问题:

lsscsi | 
  awk -F/ '/ATA/ {sub(/ $/,"", $NF); print $NF}' | 
    xargs -I % cat '/sys/block/%/queue/scheduler'
  • sub(/ $/,"", $NF) 将字段 $NF 中的尾随 space 替换为空字符串,从而有效地将其删除。
  • 请注意我是如何(单引号)引用 cat 的论点的,以使其即使在文件名带有 space 的情况下也能正常工作。