如何grep文件中的文本并显示包含文本的段落?

Jay*_*iam 27 grep sed awk perl text-processing

以下是文件中的文本:

Pseudo name=Apple
Code=42B
state=fault

Pseudo name=Prance
Code=43B
state=good
Run Code Online (Sandbox Code Playgroud)

我需要 grep 为“42B”并从上面的文本中获取输出,例如:

Pseudo name=Apple
Code=42B
state=fault
Run Code Online (Sandbox Code Playgroud)

有没有人对如何实现这一想法使用grep/ awk/ sed

llu*_*lua 44

awk

awk -v RS='' '/42B/' file
Run Code Online (Sandbox Code Playgroud)

RS=将输入记录分隔符从换行符更改为空行。如果记录中的任何字段包含/42B/打印记录。

''(空字符串)是一个魔术值,用于根据 POSIX表示空行:

如果RS为空,则记录由<newline>加一个或多个空行组成的序列分隔,前导或尾随空行不应在输入的开头或结尾导致空记录,并且 a<newline>应始终为字段分隔符,不管FS的价值是多少。

由于输出分隔符仍然是单个换行符,因此不会分隔输出段落。为确保输出段落之间有一个空行,请将输出记录分隔符设置为两个换行符:

awk -v RS='' -v ORS='\n\n' '/42B/' file
Run Code Online (Sandbox Code Playgroud)

  • @jasonwryan,除非您需要访问 awk 中的文件名(`FILENAME`),使用重定向不是一个坏主意,因为它可以避免包含 `=` 或以 `-` 开头(或以 `-` 开头)的文件名出现问题, 使错误消息一致,并避免在无法打开输入文件时运行 `awk` 或执行其他重定向。 (2认同)

slm*_*slm 15

假设数据是结构化的,因此它始终是您想要的之前和之后的行,您可以使用 grep 的-A(after) 和-B(before) 开关来告诉它包括匹配之前的 1 行和之后的 1 行:

$ grep -A 1 -B 1 "42B" sample.txt
Pseudo name=Apple
Code=42B
state=fault
Run Code Online (Sandbox Code Playgroud)

如果您想在搜索词前后使用相同的数字行,您可以使用-C(context) 开关:

$ grep -C 1 "42B" sample.txt
Pseudo name=Apple
Code=42B
state=fault
Run Code Online (Sandbox Code Playgroud)

如果您想在匹配多行时更加严格,您可以使用 toolpcregrep来匹配多行的模式:

$ pcregrep -M 'Pseudo.*\n.*42B.*\nstate.*' sample.txt
Pseudo name=Apple
Code=42B
state=fault
Run Code Online (Sandbox Code Playgroud)

上面的模式匹配如下:

  • -M - 多行
  • 'Pseudo.*\n.*42B.*\nstate.*'- 匹配一组字符串,其中第一个字符串以单词开头,"Pseudo"后跟任何字符直到行尾\n,然后是任何字符直到字符串,"42B"然后是任何字符直到行尾(\n),然后是字符串"state"后跟任何字符。


小智 5

grepUnix的一些口味有-p对“段落”标志。我知道AIX 可以

grep -p 42B <myfile>
Run Code Online (Sandbox Code Playgroud)

会做你在那里要求的。YMMV 和 GNU grep 没有这个标志。