我需要使用带有多个模式和多个选项的grep过滤文本文件:
grep -e "QUESTION" -e "Query" file.txt
以上情况有效,但我需要添加一些选项,如-A
grep -e -A3 "QUESTION" -e -A5 "Query" file.txt
答案 0 :(得分:3)
您可以使用简单的黑客在awk
中执行此操作,grep
不支持此操作。
awk -v var1=4 -v var2=6 '/QUESTION/{while (count<var1) line[NR+count] count++;} \
/Query/{count=0;while (count<var2) line[NR+count] count++; }; NR in line' file.txt
此处awk
变量var1
和var2
控制需要打印多少行包括模式。与grep
-A
标记类似,但值为+。
您可以在下面看到它的示例文件: -
$ cat file.txt
QUESTION
a
bc
c
d
e
f
Query
a1
bc2
c3
d4
e5
f5
foo
现在使用值4
和6
$ awk -v var1=4 -v var2=6 '/QUESTION/{while (count<var1) line[NR+count] count++; } \
/Query/{count=0;while (count<var2) line[NR+count] count++; }; NR in line' file.txt
QUESTION
a
bc
c
Query
a1
bc2
c3
d4
e5
这可以扩展到任意数量的搜索模式。
答案 1 :(得分:2)
sed '/QUESTION/{N;N;N;p};/Query/{N;N;N;N;N;p};d' file.txt
perl -ne 'BEGIN{$p=0;};$p=4if/QUESTION/;$p=6if/Query/;$p&&do{print;$p--}' file.txt
......但我更喜欢这个:
perl -ne 'BEGIN{%search=("QUESTION"=>3,"Query"=>5);$p=0;$sre=join("|",keys%search);};
$p=1+$search{$1}if/($sre)/;$p&&do{print;$p--}' file.txt
或
perl -ne '
BEGIN{
%search=(
"QUESTION"=>3,
"Query"=>5
);
$p=0;
$sre=join("|",keys%search);
};
$p=1+$search{$1} if /($sre)/;
$p && do { print; $p--: }
' file.txt
通过这种方式,您可以轻松添加或删除包含行数的搜索字符串。
...最后,就在创建专用工具之前:
perl -ne 'BEGIN{ %search=@ARGV;@ARGV=();$sre=join("|",keys%search);};
$p=1+$search{$1} if /($sre)/;$p&&do{print;$p--;}' <file.txt Query 5 QUESTION 3
( tee >(grep -A5 Query >&5) | grep -A3 QUESTION >&5) 5>&1 <file.txt | cat
或
command | ( tee >(grep -A3 Query >&5) | grep -A5 QUESTION >&5) 5>&1 | cat
添加最后一个fifo似乎可以减少混音问题...