bash-如果找到图案,则打印两个连续行

bash-如果找到图案,则打印两个连续行,bash,awk,grep,Bash,Awk,Grep,我需要在一个文件中搜索一个字符串,并在另一个文件中打印匹配行及其下一行。 例如: 输入文件: >3456/1 A >1234/2 B >5678/1 C >8976/2 D 搜索:/2 输出: >1234/2 B >8976/2 D 使用grep: $ grep -A1 '/2' file >1234/2 B -- >8976/2 D 从man页面: -A num, --after-context=num Prin

我需要在一个文件中搜索一个字符串,并在另一个文件中打印匹配行及其下一行。 例如:

输入文件:

>3456/1
A
>1234/2
B
>5678/1
C
>8976/2
D
搜索:
/2

输出:

>1234/2
B
>8976/2
D

使用
grep

$ grep -A1 '/2' file
>1234/2
B
--
>8976/2
D
man
页面:

-A num, --after-context=num
             Print num lines of trailing context after each match.  
您可以通过管道将
--
删除到
grep-v'--'
或者如果您有GNU
grep
,则只需执行以下操作:

$ grep --no-group-separator -A1 '/2' file
>1234/2
B
>8976/2
D

您可以将此命令的输出重新定向到另一个文件

使用
grep

$ grep -A1 '/2' file
>1234/2
B
--
>8976/2
D
man
页面:

-A num, --after-context=num
             Print num lines of trailing context after each match.  
您可以通过管道将
--
删除到
grep-v'--'
或者如果您有GNU
grep
,则只需执行以下操作:

$ grep --no-group-separator -A1 '/2' file
>1234/2
B
>8976/2
D
您可以将此命令的输出重新定向到另一个文件

使用grep-A

请参见手册页:

以下是一个例子:

%grep -A2 /2 input
>1234/2
B
>5678/1
--
>8976/2
D
使用grep-A

请参见手册页:

以下是一个例子:

%grep -A2 /2 input
>1234/2
B
>5678/1
--
>8976/2
D

下面是
grep
正确的工具,但使用
awk
您将得到:

awk '/\/2/ {print $0;getline;print $0}' file
>1234/2
B
>8976/2
D

PS你应该用谷歌找到你自己。这个问题被问了很多次。

这里是
grep
正确的工具,但是使用
awk
你会得到:

awk '/\/2/ {print $0;getline;print $0}' file
>1234/2
B
>8976/2
D

PS你应该用谷歌找到你自己。这个问题被问了很多次。

使用GNU
sed

sed -n '/\/2/,+1p' file
例如:

$ sed -n '/\/2/,+1p' file
>1234/2
B
>8976/2
D

使用GNU
sed

sed -n '/\/2/,+1p' file
例如:

$ sed -n '/\/2/,+1p' file
>1234/2
B
>8976/2
D

为什么要使用
getline
awk'/\/2/{c=2}c-->0'文件
@jaypal这也会起作用。为什么?
getline
awk
中的一个函数,它可以正常工作,但您必须克服一些缺陷。或者您也可以这样做:
awk'/\/2/{{uU=2}_&&_--'file
不必要地使用getline和名为
.
的变量-你已经进入了黑暗的一面…@jaypal-你需要
c&&c--
而不是
c-->0
的原因是后者将不断递减
c
,即使在它为负值之后,理论上如果输入文件足够大,你也可以这样做环绕签名数字的大小,使其再次显示为正数,然后从该点开始打印文件。谢谢@EdMorton。这是一个伟大的观点。我没想到。感谢你的解释<代码>:)。为什么要使用
getline
awk'/\/2/{c=2}c-->0'文件
@jaypal这也会起作用。为什么?
getline
awk
中的一个函数,它可以正常工作,但您必须克服一些缺陷。或者您也可以这样做:
awk'/\/2/{{uU=2}_&&_--'file
不必要地使用getline和名为
.
的变量-你已经进入了黑暗的一面…@jaypal-你需要
c&&c--
而不是
c-->0
的原因是后者将不断递减
c
,即使在它为负值之后,理论上如果输入文件足够大,你也可以这样做环绕签名数字的大小,使其再次显示为正数,然后从该点开始打印文件。谢谢@EdMorton。这是一个伟大的观点。我没想到。感谢你的解释<代码>:)。