Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在shell命令中绕过文件头的通用解决方案_Linux_Shell_Zsh - Fatal编程技术网

Linux 在shell命令中绕过文件头的通用解决方案

Linux 在shell命令中绕过文件头的通用解决方案,linux,shell,zsh,Linux,Shell,Zsh,我广泛使用多个linux shell命令,例如: grep BLAH file1 | sed 's/old/new/' | sort -k 1,1 > file3 我的文件通常有一个标题行,并且通常我必须在整个管道中保留它。例如,我想从第2行开始grep、sed和排序,同时保持第1行不变 我正在寻找一些通用的解决方案,给定一些命令可以保留标题。我通常在管道之前将头写入文件,然后在管道结束后将其返回。我已经开始使用zshell,所以我想知道这是否有助于获得更精简的解决方案 也许是这样的:

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

grep BLAH file1 | sed 's/old/new/' | sort -k 1,1 > file3
我的文件通常有一个标题行,并且通常我必须在整个管道中保留它。例如,我想从第2行开始grep、sed和排序,同时保持第1行不变

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

也许是这样的:

(箭头是图像中的管道)

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


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

Vaughn和devnull已经向您介绍了解决方案。虽然它们都包含拼写错误,但我有一些要补充的意见,并建议改为使用:

{ head -n 1 file1; tail -n +2 file1 | grep BLAH | sed 's/old/new/' | sort -k 1,1; } >file3
它所做的是在一个命令(您的头)中获取
file1
的第一行,并在文件的其余部分(无头,
tail-n+2
)的第二个命令中执行
grep/sed/which
魔术,并将组合输出重定向到
file3

注:

  • 如果您的shell支持
    {}
    ,那么在这种情况下,它比
    ()
    构造更受欢迎,因为它不会生成子shell(尽管有时需要有子shell)
  • head-2
    已弃用,应使用
    -n
    参数,如
    head-n2
  • 如果您完全知道在头文件中找不到您要搜索的内容,您可以跳过
    tail-n+2 file1
    部分,但这样做肯定会更干净

顺便说一句,这在最新的shell中应该可以使用。

我不确定zsh是什么,但是对于bash,您可以使用
(head-2 file1;tail-n+3 file1 | grep BLAH | sed's/old/new/'| sort-k 1,1)>file3
@Vaughn您似乎已经考虑了两行标题。你可能是指
(head-n+1诸如此类;tail-n+2诸如此类| sed's/old/new'| sort-k 1,1)>outfile
@devnull:你说得对。我习惯于使用两行标题的文件,只是不假思索地使用了它。+1提供了一个有用的图像来说明您的意图:-)