我想使用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
答案 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”,它既是第一个也是最后一个。