【问题标题】:bash: how do I concatenate the output of two commands so that I can pipe them to a third?bash:我如何连接两个命令的输出,以便我可以将它们传送到第三个?
【发布时间】:2011-11-21 21:02:54
【问题描述】:
$ hg status

$ hg status --ignored

给出非常相似的输出。我想将它们连接起来,这样我就可以将它们提供给 awk,就好像有一个 hg status --all(或 svn 的 svn status --no-ignore

我在想这样的事情:

$ echo "$(hg status)" "$(hg status --ignored)" | awk  ' ( $1 == "?" ) || ( $1 == "I") { print $2 }' | xargs rm -r

创建一个“确实非常干净”的命令,但它似乎偶尔会留下一个文件,可能是因为缺少换行符或其他原因。

【问题讨论】:

  • 如果将rm 替换为echo(或跳过最后一个管道),那么输出是什么,应该是什么?此外,rm 拒绝删除文件可能存在权限问题。

标签: bash shell mercurial awk concatenation


【解决方案1】:

使用curly braces to group commands:

$ { echo first line; echo second line; } | grep "line"
first line
second line

(作为camh's comment的答案发布)

【讨论】:

  • 太好了,谢谢。这就是我一直在寻找的,试图将标头与另一个命令的输出一起传递给sendmail -t
【解决方案2】:

您可以使用子shell:

( hg status; hg status --ignored ) | awk '( $1 == "?" ) || ( $1 == "I") { print $2 }' | xargs rm -r

【讨论】:

  • 不需要使用子shell(另一个进程)。相反,您可以使用大括号进行分组:{ a; b; } | c
  • 我没有看到有意义的速度差异time { git branch; git branch -r; } > /dev/null; time (git branch; git branch -r) > /dev/null 实际上 subshel​​l 在我的系统上始终更快 - 所以@camh,组的优势是什么?
  • @MarkFox:可能是测量错误。该组的fork() 比子shell 少一个。很难衡量一次这样的事情。你想运行它 1000 次或更多,以获得对性能的良好感觉。当我这样做时,该组在 1.69 秒出现,而子外壳在 2.36 秒出现,这大约慢了 40%。
【解决方案3】:

您可以使用其余的 hg 状态标志来显示您真正想要的内容:

hg status -uriamn

显示未知文件 (u)、删除文件 (r)、忽略 (i)、添加 (a)、修改 (m) 并且不显示状态前缀。

【讨论】:

  • +1 我刚刚写下了“为什么不试试hg st -iu|awk ...?”看到你的答案出现了......
  • 我会早点发帖的,但我试图用这些标志制作一个有趣的字谜;-)
【解决方案4】:

这对我有用:

echo $(a)$(b)

如果添加“”,则可以添加分隔符,例如:

echo "$(./gethostname.sh)|($(./getip.sh);"

我在 Openwrt 上使用它来广播我的 ip 设置:

echo "$( uci get system.@system[0].hostname )|$( ip addr | grep inet | grep br-lan | cut -d ' ' -f 6 | cut -d '/' -f 1 );"  | socat - UDP-DATAGRAM:255.255.255.255:4999,broadcast ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-22
    • 2014-11-08
    • 1970-01-01
    • 2020-11-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多