如何在xargs中截断尾随空格

时间:2016-02-05 07:07:51

标签: bash unix xargs

我想使用xargs根据命令A的输出列出一些文件的内容。 Xargs replace-str似乎在最后添加一个空格并导致命令失败。有什么建议?我知道这可以解决使用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

2 个答案:

答案 0 :(得分:2)

问题是 xargs -I为每个参数附加一个空格,可以按如下方式验证:

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

顺便说一句,在添加中指定-L 1-I是没有意义的:-I 暗示逐行处理。< / p>

因此,它必须是命令的输出,它为xargs提供包含尾随空格的输入。
您可以调整awk命令来修复:

lsscsi | 
  awk -F/ '/ATA/ {sub(/ $/,"", $NF); print $NF}' | 
    xargs -I % cat '/sys/block/%/queue/scheduler'
  • sub(/ $/,"", $NF)用空字符串替换字段$NF中的尾随空格,从而有效地删除它。
  • 请注意我是如何(单个)引用cat的参数,以便即使文件名包含空格也能正常工作。

答案 1 :(得分:0)

lsscsi |awk -F\/ '/ATA/ {print $NF}'| awk '{print $NF}' | xargs -L 1 -I % cat /sys/block/%/queue/scheduler

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