我广泛使用管道多个linux shell命令,例如:
grep BLAH file1 | sed 's/old/new/' | sort -k 1,1 > file3
我的文件通常有一个标题行,我经常需要在整个管道中保留它。所以,例如,我想要从第2行和第2行进行grep,sed和sort,同时保持第1行不变。
我正在寻找一些通用的解决方案,给定一些命令可以保留标头。我通常在管道之前将标题写入文件,然后在管道结束后将其回收。我已经开始使用zshell了,所以我想知道这是否有助于获得更简化的解决方案。
也许是这样的:
(箭头是图像中的管道)
但是我不知道如何让它在zshell中工作或者甚至可能。一个问题是我需要在两个管道上使用命令跟进第一个管道拆分。
任何有创意的解决方案?
答案 0 :(得分:2)
Vaughn和devnull已经指示你解决问题。它们都包含拼写错误,我有一些要添加的备注,并建议使用它:
{ head -n 1 file1; tail -n +2 file1 | grep BLAH | sed 's/old/new/' | sort -k 1,1; } >file3
它的作用是在一个命令(你的标题)中取file1
的第一行,并在文件的其余部分的第二个命令中执行grep/sed/whatever
魔术(没有标题,{{ 1}})并将组合输出重定向到tail -n +2
。
注意:
file3
,那么在这种情况下,它优先于{ }
构造,因为它不会产生子shell(尽管有时也希望有子shell)。( )
,您应该使用head -2
等-n
参数head -n 2
部分,如果你完全知道在你的标题中找不到你正在寻找的东西,但它肯定更清洁。这应该适用于最新的shell,btw(bash,ksh,zsh)。