grep --before-context 5
在比赛前显示5行。
我想展示比赛前的一切。
这样做grep --before-context 99999999
是可行的,但不是很...专业。
如何显示匹配的所有文件?
grep --before-context 5
在比赛前显示5行。
我想展示比赛前的一切。
这样做grep --before-context 99999999
是可行的,但不是很...专业。
如何显示匹配的所有文件?
Answers:
塞德对此更好。
做就是了:
sed '/PATTERN/q' FILE
它的工作方式如下:
对于每一行,我们查看它是否匹配/PATTERN
:
这是最有效的解决方案,因为它一看到PATTERN
就退出。如果没有q
,sed将继续读取文件的其余部分,并且不执行任何操作。对于大文件,可以有所作为。
这个技巧也可以用来模仿head
:
sed 10q FILE
sed '/PATTERN/Q' FILE
将跳过匹配的行。Q
是GNU扩展,因此它不适用于任何sed。
sed
可以取代grep的大部分功能。
sed -n '1,/<pattern>/ p' <file>
这意味着从第一行开始打印,直到匹配图案为止。
几个范围示例
sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
打印并包括以下匹配项:
awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename
最多打印但不包括匹配项:
awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
Q
酷但GNU特有的afaik,sed -n '/pattern/!p;//q'
会更便携。
!
让p
适用于线不匹配pattern
,但随后//q
混淆了我...
//
意思是“先前的正则表达式”(我以为意思是“匹配空字符串”)。我认为相同的解决方案的一个较短的版本是:sed -n '/pattern/q;p
?
以下纯GNU grep
方法效率不高。
使用三个s 在文件栏中搜索字符串“ foo ” 的第一个实例之前的所有内容:grep
grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar
匹配“ foo ” 的最后一个实例:
grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar
注意:有关最后一项的详细信息,请grep
参见:正则表达式(grep),需要进行多行搜索。
sed
代码似乎值得其回答,或者可以将其添加到其他代码中。回复7个grep
S:因为没有grep
答案......(加,得到的答案有助于表明为什么不呢?)
在上面添加到Mikel的答案中...
要打印所有线路可达,但不包括,第一行FILE
包含PATTERN
,尝试:
sed '/.*PATTERN.*/{s///;q;}' FILE
这将匹配包含模式的整行,将其替换为空白行,然后退出而不处理文件的其余部分。
后记:
我想避免在末尾打印额外的换行符(不涉及其他工具)的最简单/最清晰的方法是再次运行sed并删除新的最后一行:
sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'
...并且由于我们现在无论如何都删除该行,因此我们以前的工作是多余的,我们可以简化为:
sed '/PATTERN/q' FILE | sed '$d'
sed
调用来做到这一点。
tcsh
和bash
别名中都使用了它,因此我需要确保有一个相对简洁的单线解决方案,可在标准和GNU中使用sed
(出于可移植性);您的贡献很可能满足的所有要求。正如有人谁使用sed
非常罕见,我最重要的要求是什么,当我不想轻易从现在编辑或重新目的,多年来,我可以很快的了解。
对于只选择记住日常工作中的基本工具,并愿意接受不太优雅,效率较低的解决方案的人们:
head -n $(grep -n pattern filename | cut -d: -f1) filename
如果此命令用于脚本,那么我将寻找更优雅(且可能高效)的解决方案。如果这是一次性命令或一次性脚本,那么我不在乎。
您也可以使用以下之一
tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac
要么
tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac
要么
tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac
第一个选项与OP所建议的非常相似,只是它通过计算文件中的行数来确保ti在上下文之前显示足够的行数
第二个选项搜索第一个匹配项的行号(您也可以通过更改内部的“ head”来更改行号),然后在该编号上使用head
最后一个选项将所有新行替换为匹配项,然后将两个相邻的匹配项替换为新行。此输出是两次匹配之间每个文本块的一行。之后,它使用“ head”选择第一行(将文本块更改为第一个匹配项),然后将每个匹配项重新转换为新行。仅当文件采用以下格式时,此选项才有效
pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern
texttexttext
texttexttexttexttexttexttexttexttext
依此类推
sed
底部的命令有点过时。