it-swarm.cn

显示所有符合条件的文件

grep --before-context 5显示比赛前5行。

我想在比赛前展示一切。
正在做grep --before-context 99999999可以工作,但不是很...专业。

如何显示所有符合条件的文件?

78
Nicolas Raoul

Sed 对此更好。

做就是了:

sed '/PATTERN/q' FILE

它是这样的:

对于每一行,我们查看其是否匹配/PATTERN

  • 如果是,我们将其打印并退出
  • 否则,我们将其打印

这是最有效的解决方案,因为一旦看到PATTERN,它就会退出。如果没有q,sed将继续读取文件的其余部分,并且不执行任何操作。对于大文件,可以有所作为。

这个技巧也可以用来模拟head

sed 10q FILE
104
Mikel

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
39
forcefsck

打印并包括以下匹配项:

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename

最多打印但不包括匹配项:

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
39
glenn jackman

对于那些只选择记住日常工作中的基本工具,并愿意接受不太优雅,效率较低的解决方案的人:

head -n $(grep -n pattern filename | cut -d: -f1) filename

如果此命令用于脚本,那么我将寻找更优雅(且可能高效)的解决方案。如果这是一次性命令或一次性脚本,那么我不在乎。

1
lesmana

在上面添加米克尔的答案...


要打印所有行直到但不包括FILE中包含PATTERN的第一行,请尝试:

  • sed '/.*PATTERN.*/{s///;q;}' FILE

这将匹配包含模式的整行,将其替换为空白行,然后退出而不处理文件的其余部分。


后记:

我想避免在末尾打印额外的换行符(不涉及其他工具)的最简单/最清晰的方法是再次运行sed并删除新的最后一行:

sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'

...并且由于我们现在无论如何都删除该行,因此我们以前的工作是多余的,我们可以简化为:

sed '/PATTERN/q' FILE | sed '$d'
1
Jim Grisham

以下纯GNU grep)方法无效。

使用三个greps在文件bar中搜索字符串“ foo”的first实例为止的所有内容:

grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar

与“ foo”的last实例匹配:

grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar

注意:最后一个grep的详细信息可以在以下位置找到: 需要用于多行搜索的Regex(grep)

1
agc

您也可以使用以下之一

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

依此类推

0
user122778