将前X行传送到一个命令,其余传送到另一个命令

时间:2018-10-29 19:39:01

标签: bash pipe

是否有一种优雅的方法(按行)将命令的STDOUT拆分为两个不同的程序?

用例是我有一个命令,该命令可以打印出我想通过管道传输到column -t的列数据,但是它也可以在顶部打印一些常规信息和日志,例如

$ first-command
Connecting to XYZ
Total lines: 2
Id  Status  Type
id-001  INPROGRESS  5
id-002  PENDING 1

如果按原样将其通过管道传输到column,则会得到:

$ first-command | column -t
Connecting  to          XYZ
Total       lines:      2
Id          Status      Type
id-001      INPROGRESS  5
id-002      PENDING     1

相反,我希望它正常打印前两行,然后column打印其余两行,例如

$ first-command | split-stdout -n 2 "cat" "column -t"
Connecting to XYZ
Total lines: 2
Id      Status      Type
id-001  INPROGRESS  5
id-002  PENDING     1

编辑:将前X行直接插入STDOUT也可以。

2 个答案:

答案 0 :(得分:2)

SigninHistory.update(member_id, logout_time: Time.now) 有效。

我没有将输出内容吐出来的命令,所以我将其放入示例文件中:

awk

将其输入以下$ cat column.txt Connecting to XYZ Total lines: 2 Id Status Type id-001 INPROGRESS 5 id-002 PENDING 1 ,然后获取所需的输出:

awk

该代码专门针对行号<= 2:  $ cat column.txt | awk 'NR<=2{print;next}{print | "column -t"}' Connecting to XYZ Total lines: 2 Id Status Type id-001 INPROGRESS 5 id-002 PENDING 1 仅打印输出并转到下一行: NR<=2

对于大于第二行的所有行,将执行下一个块,并将其打印到{print; next}的管道中

答案 1 :(得分:0)

您可以使用tee命令以相同的输入“馈送”两个不同的命令:

echo "hello world" | tee >(cut -d' ' -f2) | cut -d' ' -f1

输出

hello
world

对于您要执行的工作,您可以将first-command的输出发送到tee,然后将前两行打印到输出文件>(head -2 > output),然后打印其余的行以将它们处理为相同的输出tail -n +3 | column -t >> output