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
这些打印test1
到test2
之间的数据
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
为了排除包含test1
和test2
的行,请说:
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
换行符,然后是test2
string。
以下脚本包装了这个过程。 在这个类似的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