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)
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 没有这个标志。