Bash,两行之间用指定的stringgrep

例:

a43 test1 abc cvb bnm test2 kfo 

我需要test1和test2之间的所有线路。 正常的grep在这种情况下不起作用。 你有什么主张吗?

她是awk这些将从test1打印到test2

 awk '/test1/{f=1} /test2/{f=0;print} f' awk '/test1/{f=1} f; /test2/{f=0}' awk '/test1/,/test2/' 

 test1 abc cvb bnm test2 

这些打印test1test2之间的数据

 awk '/test1/{f=1;next} /test2/{f=0} f' awk '/test2/{f=0} f; /test1/{f=1}' 

 abc cvb bnm 

你可以使用sed

 sed -n '/test1/,/test2/p' filename 

为了排除包含test1test2的行,请说:

 sed -n '/test1/,/test2/{/test1/b;/test2/b;p}' filename 

如果你只能使用grep:

 grep -A100000 test1 file.txt | grep -B100000 test2 > new.txt 

grep -A然后一个数字获取匹配string后的行, grep -B获取匹配string之前的行。 在这种情况下,数字100000必须足够大以包括前后的所有行。

如果你不想包含test1和test2,那么你可以通过grep -v来删除它们,除了匹配的行之外,它们都会打印出来:

 egrep -v "test1|test2" new.txt > newer.txt 

或一行一行:

 grep -A100000 test1 file.txt | grep -B100000 test2 | egrep -v "test1|test2" > new.txt 

是的,正常的grep不会这样做。 但是用-P参数grep会做这个工作。

 $ grep -ozP '(?s)test1\n\K.*?(?=\ntest2)' file abc cvb bnm 

\K丢弃最后打印的先前匹配的字符,并且正向前瞻(?=\ntest2)声明匹配必须后跟一个\n换行符,然后是test2string。

以下脚本包装了这个过程。 在这个类似的StackOverflow后的更多细节

get_text.sh

 function show_help() { HELP=$(doMain $0 HELP) echo "$HELP" exit; } function doMain() { if [ "$1" == "help" ] then show_help fi if [ -z "$1" ] then show_help fi if [ -z "$2" ] then show_help fi FILENAME=$1 if [ ! -f $FILENAME ]; then echo "File not found: $FILENAME" exit; fi if [ -z "$3" ] then START_TAG=$2_START END_TAG=$2_END else START_TAG=$2 END_TAG=$3 fi CMD="cat $FILENAME | awk '/$START_TAG/{f=1;next} /$END_TAG/{f=0} f'" eval $CMD } function help_txt() { HELP_START get_text.sh: extracts lines in a file between two tags usage: FILENAME {TAG_PREFIX|START_TAG} {END_TAG} examples: get_text.sh 1.txt AA => extracts lines in file 1.txt between AA_START and AA_END get_text.sh 1.txt AA BB => extracts lines in file 1.txt between AA and BB HELP_END } doMain $* 

你也可以做这样的事情。 让我们说这个文件test.txt与内容:

 a43 test1 abc cvb bnm test2 kfo 

你可以做

cat test.txt | grep -A10 test1 | grep -B10 test2

其中-A<n>是在文件匹配后得到n行,而-B<n>是在匹配之前给你n行。 你只需要确保n > number of expected lines between test1 and test2 。 或者你可以给它足够大,以达到EOF。

结果:

 test1 abc cvb bnm test2 

上面的PratPor的答案是:

 cat test.txt | grep -A10 test1 | grep -B10 test2 

很酷..但如果你不知道文件的长度:

 cat test.txt | grep -A1000 test1 | grep -B1000 test2 

不确定,但不是太糟糕。 任何人都有更好的(更确定的)?

 awk '/test1/,/test2/' filename.txt > outputFile.txt