Linux 在sed或awk中,如何处理可能跨越多行的记录分隔符?

Linux 在sed或awk中,如何处理可能跨越多行的记录分隔符?,linux,sed,awk,gawk,Linux,Sed,Awk,Gawk,我的日志文件是: Wed Nov 12 blah blah blah blah cat1 Wed Nov 12 blah blah blah blah Wed Nov 12 blah blah blah blah Wed Nov 12 blah blah blah blah cat2 more blah blah even more blah blah Wed Nov 12 blah blah blah blah cat3 Wed Nov 12 blah bla

我的日志文件是:

 Wed Nov 12 blah blah blah blah cat1
 Wed Nov 12 blah blah blah blah
 Wed Nov 12 blah blah blah blah 
 Wed Nov 12 blah blah blah blah cat2
     more blah blah
     even more blah blah
 Wed Nov 12 blah blah blah blah cat3
 Wed Nov 12 blah blah blah blah cat4
我想解析出cat位于第一行的完整多行条目。在
sed
和/或
awk
中执行此操作的最佳方法是什么

i、 e.我希望我的分析产生:

 Wed Nov 12 blah blah blah blah cat1
 Wed Nov 12 blah blah blah blah cat2
     more blah blah
     even more blah blah
 Wed Nov 12 blah blah blah blah cat3
 Wed Nov 12 blah blah blah blah cat4

假设日志文件不包含控制字符
'\01'
'\02'
,并且连续的一行正好以四个空格开头,则以下操作可能有效:

c1=`echo -en '\01'`
c2=`echo -en '\02'`
cat logfile | tr '\n' $c1 | sed "s/$c1    /$c2/g" | sed "s/$c1/\n/g" | grep cat | sed "s/$c2/\n    /g"

说明:这将用ASCII 1(不应出现在日志文件中的控制字符)替换每个换行符,并用ASCII 2(另一个控制字符)替换每个序列“换行符空间”。然后,它用换行符重新替换ASCII 1,因此现在将多行的每个序列放在一行中,旧的换行符替换为ASCII 2。对于cat,这是灰色的,然后ASCII 2被换行符空间组合所取代。

如果你说每一行以空格开头都是(g)awk的延续(这是我记忆中的,所以可能它包含一些小的打字错误,为了更好的可读性,还有一些额外的换行符):

其中
无论什么
都是检查是否应该输出(例如,对于cat)。

类似的内容

awk 'function print_part() { if(cat) print part }  /^  / { part = part "\n" $0; next } /cat[0-9]$/ { print_part(); part = $0; cat = 1; next;  } { print_part(); cat=0} END { print_part() }' inputfile
/^/
regexp标识连续行


/cat[0-9]$/
regexp标识要保留的起始行。

另一种方法是将
RS
设置为正常的
\n
以外的内容。例如:

$ awk -v Pre=Wed 'BEGIN {RS = "\\n?\\s*" Pre} /cat.\n?/ {print Pre $0}' file.log
Wed Nov 12 blah blah blah blah cat1
Wed Nov 12 blah blah blah blah cat2
     more blah blah
     even more blah blah
Wed Nov 12 blah blah blah blah cat3
Wed Nov 12 blah blah blah blah cat4

那么,如何定义逻辑行的结尾呢?任何以空行开头的行是否自动被视为其上方行的扩展?
$ awk -v Pre=Wed 'BEGIN {RS = "\\n?\\s*" Pre} /cat.\n?/ {print Pre $0}' file.log
Wed Nov 12 blah blah blah blah cat1
Wed Nov 12 blah blah blah blah cat2
     more blah blah
     even more blah blah
Wed Nov 12 blah blah blah blah cat3
Wed Nov 12 blah blah blah blah cat4