Linux 在shell命令中绕过文件头的通用解决方案
我广泛使用多个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,所以我想知道这是否有助于获得更精简的解决方案 也许是这样的:
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提供了一个有用的图像来说明您的意图:-)