3

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

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

我的文件通常有一个标题行,而且我经常必须在整个管道中保留它。因此,例如,我想从第 2 行开始进行 grep、sed 和排序,同时保持第 1 行不变。

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

也许是这样的:

在此处输入图像描述

(箭头是图中的管道)

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

有什么创造性的解决方案吗?

4

1 回答 1

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魔术,然后在文件的其余部分(没有标头)的第二个命令中执行您的魔法,并将组合输出tail -n +2重定向到.file3

笔记:

  • 如果您的 shell 支持,则在这种情况下,它{ }( )构造更可取,因为它不会生成子 shell(但有时需要子 shell)。
  • head -2已弃用,您应该使用-n类似的参数head -n 2
  • tail -n +2 file1如果您绝对知道在您的标题中找不到您正在寻找的内容,您可以跳过该部分,但这样肯定更干净。

这应该适用于最新的 shell,顺便说一句(bash、ksh、zsh)。

于 2013-04-09T15:48:41.577 回答