如何grep / sed / awk并获得下一行直到某个模式

时间:2016-04-21 16:24:19

标签: bash awk sed grep pattern-matching

我很难从文本文件中抓取几行。例如,我说文件中有以下文字:

A I have a cat
B I have a dog
C I have a mouse
X I have a monkey
B I have a rat
T I have a cat
C I have a deer
X I have a turkey

我试图找到包含单词“cat”的所有行,如果句子的第一个字母是“A”,我想得到接下来的几行(包括与模式匹配的行) cat“)直到我遇到字母”X“作为一行的第一个字母。

例如,上面的文本文件应打印出来:

A I have a cat
B I have a dog
C I have a mouse

(打印出来直到看到X)

注意:“我有一只猫”这一行不应该匹配,因为即使它有猫,它也不会以字母“A”开头

我尝试寻求帮助,但在匹配某个模式之前找不到任何关于打印行的信息。我能找到的最接近的是

awk '/cat/ {for(i=0; i<=5; i++) {getline; print}}' filename

但打印出一定数量的行。我希望它打印出来,直到它看到下一个模式是“X”

2 个答案:

答案 0 :(得分:1)

$ awk '/^X/{f=0} /^A.*cat/{f=1} f' file
A I have a cat
B I have a dog
C I have a mouse

答案 1 :(得分:1)

使用sed代替awk

$ sed -n '/^A.* cat/,/^X/{/^X/d;p;}' data
A I have a cat
B I have a dog
C I have a mouse
$
  • -n - 默认情况下不打印,
  • /^A.* cat/ - 来自以A开头并在空格后面包含cat的行(调整为适合cat的定义;它会选择A I visited the catacombs ,例如),
  • /^X/ - 最后一行以X开头,
  • {/^X/d; - 删除以X开头的任何行(唯一行),然后继续处理下一行
  • p;} - 打印线。

如图所示,它将与BSD sed和GNU sed一起使用; GNU sed不需要最后一个分号。