Grep - 具有单独上下文的复合语句?

时间:2012-07-03 02:06:11

标签: grep

请考虑以下示例:

$ echo -e "-wordA \n 1\n 2\n 3\n-wordB \n 1\n 2\n 3\n" | grep -n -A1 -e '^-wordA' -A2 -e '^-wordB'
1:-wordA 
2- 1
3- 2
--
5:-wordB 
6- 1
7- 2

我上面要做的是,当-wordA在行首时匹配时,有1行“后上下文”,当-wordB匹配时,有2行后上下文。显然,我的尝试不起作用,因为在两场比赛中,我获得了2行上下文。

显然,在上下文的最后一个设置中,成为所有搜索的设置;但我只是想确定 - 是否可以使用grep进行具有单独上下文的“复合”搜索? (编辑:特别是,我的意思是通过调用grep的单个实例来使用,可能会避免临时文件)

非常感谢任何答案,
干杯!

2 个答案:

答案 0 :(得分:2)

我不知道如何使用grep(1)执行此操作。我相信我已经写了一个小awk脚本来做你想要的事情;试试这个:

$ echo -e "-wordA \n 1\n 2\n 3\n-wordB \n 1\n 2\n 3\n" |
  awk '/^-wordA/ {print; getline; print;}
       /^-wordB/ {print; getline; print; getline; print;}'
-wordA 
 1
-wordB 
 1
 2
$ 

我为了易读性而任意包裹线条 - 当然,你需要使它完全合适。

答案 1 :(得分:1)

使用grep的解决方案,假设当前目录中没有output1 output2文件

echo -e "-wordA \n 1\n 2\n 3\n-wordB \n 1\n 2\n 3\n" | tee >(grep -n -A1 -e '^-wordA' >output1) >(grep -n -A2 -e '^-wordB' >output2) >/dev/null ; cat output1 output2