打印行匹配表达式和匹配表达式行后的第5行

时间:2014-07-24 13:08:56

标签: perl unix awk sed

我有一个像这样的文件

pin
port
coord
some info
some more info

pin
port
coord
some info
some more info

我想grep" pin"和" some info"进入文件

我试过grep -A 3 pin input.txt | sed -n '4~5p'

这只会给我" someinfo"线。

我希望我的输出为

pin
some info

pin
some info

awk,sed等中的任何建议。!!!

6 个答案:

答案 0 :(得分:3)

$ awk '/pin/{print; n=0} ++n==4{print $0 ORS}' file
pin
some info

pin
some info

或者如果输出记录之间不需要空行:

$ awk '/pin/{print;n=0} ++n==4' file
pin
some info
pin
some info

$ awk '/pin/{n=0} ++n~/^[14]$/' file
pin
some info
pin
some info

答案 1 :(得分:0)

例如,您可以选择每一行4k4k+1

$ grep -A 3 --no-group-separator "pin" file | awk 'NR%4<=1'
pin
some info
pin
some info

请注意--no-group-separator的重要性:

$ grep -A 3 --no-group-separator "pin" file
pin
port
coord
some info
pin                   # no "--" between matches
port
coord
some info

可是:

$ grep -A 3 "pin" file
pin
port
coord
some info
--
pin
port
coord
some info

答案 2 :(得分:0)

perl -lne 'print if /pin|some info/;' in.txt > out.txt 

答案 3 :(得分:0)

awk 'n==5 {print; n=0} /pin/ {print; n=1} n{n++}' pin.in

答案 4 :(得分:0)

如果您实际上正在寻找名为&#34;某些信息&#34;

的行,这两项都应该有效

1)sed -n -e 's/pin/&/p' -e 's/some info/&/p' input.txt
默认情况下,-n表示不打印该行 -e允许多次搜索 &是对前两个/之间匹配的引用 p表示打印最后两个/之间的内容 因此,它一起搜索input.txt pinsome info并仅打印包含它们的行

2)awk '/pin/ {print} /some info/ {print}'
这样做也是如此;它搜索pinsome info并仅打印这些行 这两个命令的输出是: pin some info pin some info
如果第一个some info和第二个pin之间的空行是绝对必要的,我可以尝试找出插入它的方法(可能使用sed

编辑:
我意识到您实际上可以使用sed -n -e '/pin/p' -e '/some info/p' input.txt而不是上面的sed命令(没有s标志而没有&)。这种方式更短,更易读。

答案 5 :(得分:0)

试试这个:

perl -00 -nlE 'say map {"$_\n"} (split /\n/, $_)[0,3]' < filename

用于下一个输入:

pin
port
coord
some info
some more info

bla
port2
coord2
bla some info2
some more info2

打印

pin
some info

bla
bla some info2