Bash,使用grep,sed或awk提取文本部分然后匹配

时间:2015-06-17 12:16:50

标签: bash awk sed grep

我有一个文本文件,想要提取所有匹配" blue"

的接口
random text random text random text 
random text random text 

int 1
    random text
    blue
    random text
    random text
int 2
    random text
    random text
    red
    random text
int 3
    random text
    random text
    random text
    blue
    random text
    random text
int 4
    blue
    random text
int n
    random text
    value
    random text

random text random text random text 
random text random text

通缉输出:

int 1
    blue
int 3
    blue
int 4
    blue
int n
    blue

(注意int 2是"红色"因此不显示)

我试过了:grep" int" -A n file.txt | grep" blue"但是只显示匹配" blue"的行。我还要显示匹配" int"的行。部分长度也可以变化,因此使用-A n并不是很有用。

4 个答案:

答案 0 :(得分:2)

awk解决方案可能如下:

awk '/^int/{interface = $0} /blue/{print interface; print $0}' input.txt

它始终保存最新发现的界面。如果找到blue,则会打印存储的界面和包含blue的行。

答案 1 :(得分:2)

另一种解决方案

将适用于多重布鲁斯

sed -n '/^int/{x;/blue/{p;d}};/blue/H' file

输入

random text random text random text
random text random text

int 1
    random text
    blue
    blue
    random text
    random text
int 2
    random text
    random text
    red
    random text
int 3
    random text
    random text
    random text
    blue
    random text
    random text
int 4
    blue
    blue
    blue
    blue
    blue
    random text
int n
    random text
    value
    random text

random text random text random text
random text random text

输出

int 1
    blue
    blue
int 3
    blue
int 4
    blue
    blue
    blue
    blue
    blue

答案 2 :(得分:1)

一种可能的GNU sed解决方案

sed -n '/^int\|blue/p' file | sed -r ':a; N; $! ba; s/int \w*\n(int)/\1/g; s/int \w*$//' 

输出

int 1  
    blue  
int 3  
    blue  
int 4  
    blue 

答案 3 :(得分:1)

sed '/^int/ h
     /^[[:space:]]*blue/ {x;G;p;}
     d
     ' YourFile
  • 假设每个段落有1个蓝色,随机文本不是 int blue
  • 一个班轮可能(但不太明确)

添加(后)约束

  • paragraphe都是 int 启动,没有其他(如 ext 1 ,...)

阐释:

  • 在缓冲区中出现时保持int行
  • 当出现蓝色时,添加最后一行(exchance缓冲区,添加2个缓冲区,因此标题而不是蓝色),打印结果{x;G;p;}(其他操作根据H;x;p或{H;g;p之类的任何其他兴趣提供相同的内容{1}},在这种情况下,这是标题破坏性的,但使用s///可能是保守的)
  • 删除内容(不打印并循环到下一行)