【问题标题】:How to truncate trailing space in xargs如何截断 xargs 中的尾随空格
【发布时间】:2018-11-05 05:16:18
【问题描述】:

我想使用 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

【问题讨论】:

  • lsscsi 命令的输出是什么?

标签: bash unix xargs


【解决方案1】:

问题是notxargs -I,它确实not在每个参数后附加一个空格,可以验证如下:

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

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

因此,为xargs 提供输入的命令的输出必须包含尾随空格。
你可以调整你的awk 命令来解决这个问题:

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

【讨论】:

    【解决方案2】:
    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”,它既是第一个也是最后一个。

    【讨论】:

    • 请不要简单地转储代码,也请提供解释
    • @arco444,除非提问者需要,否则请不要简单地转储解释。让 OP 思考和理解,除非被 -F 选项更改,否则 awk 将 " " 空格视为归档分隔符并且不包含它,因此最后一个有效单词变为 $NF。
    • @JayKumarR,答案不仅适用于 OP,而且适用于每个人——根据关于元的讨论/共识,仅代码的答案只有在“自我记录、简洁、并完成”。这可能很简洁,但我不会称之为自我记录。
    • 请参阅meta.stackexchange.com/questions/148272/…,以获取更保守的观点,了解何时适合仅使用代码的答案,以及有关该主题的进一步讨论的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2011-02-12
    • 2014-04-25
    相关资源
    最近更新 更多