grep并显示两次出现内的所有行



我有一个这样布局的数据文件——

# stream 0
....
....
.... N lines of data
# stream 1
....
....
.... M lines of data

此处M!=N

我正在尝试转储只属于#stream 0-的数据

cat data.txt | grep "# stream 0$" -A N

但问题是,我既不知道N的长度,也不知道M的长度。

我需要一些命令来显示匹配后的所有数据(# stream 0),直到它命中下一个字符串# stream

我可以用grep吗?我该怎么做?

使用awk,它具有以下功能,语法简单:

 awk '/# stream 0/,/# stream 1/' data.txt

请注意,我避免使用cat:-)

对于起始模式和结束模式之间(包括起始模式和终止模式)的每一行,/startpattern/,/endpattern/语法的求值结果均为true。默认操作是打印行,因此您不需要明确地告诉awk这样做。

AWK可以很容易地完成

awk '/# stream 0/,/# stream 1/' input

将打印两个图案之间的所有行匹配

# stream 0
....
....
.... N lines of data
# stream 1

如果你想使用grep,那么你可以删除换行符和grep结果

cat input | tr -d 'n' | grep -o '# stream 0.*# stream 1'

前提是它将产生一个去除所有换行符的杂波输出

如果你真的坚持使用grep,你可以这样做:

grep -A 999999 "stream 0" file | grep -B 999999 "stream 1"

你也可以使用sed

sed -ne '/stream 0/,/stream 1/p' file

最新更新