我有一个这样布局的数据文件——
# 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