绕过shell命令中文件头的一般解决方案

时间:2013-04-09 04:30:22

标签: linux shell zsh

我广泛使用管道多个linux shell命令,例如:

grep BLAH file1 | sed 's/old/new/' | sort -k 1,1 > file3

我的文件通常有一个标题行,我经常需要在整个管道中保留它。所以,例如,我想要从第2行和第2行进行grep,sed和sort,同时保持第1行不变。

我正在寻找一些通用的解决方案,给定一些命令可以保留标头。我通常在管道之前将标题写入文件,然后在管道结束后将其回收。我已经开始使用zshell了,所以我想知道这是否有助于获得更简化的解决方案。

也许是这样的:

enter image description here

(箭头是图像中的管道)

但是我不知道如何让它在zshell中工作或者甚至可能。一个问题是我需要在两个管道上使用命令跟进第一个管道拆分。

任何有创意的解决方案?

1 个答案:

答案 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

注意:

  • 如果你的shell支持file3,那么在这种情况下,它优先于{ }构造,因为它不会产生子shell(尽管有时也希望有子shell)。
  • 不推荐使用
  • ( ),您应该使用head -2-n参数
  • 你可以跳过head -n 2部分,如果你完全知道在你的标题中找不到你正在寻找的东西,但它肯定更清洁。

这应该适用于最新的shell,btw(bash,ksh,zsh)。