如何用awk/sed实现从匹配模式前一行到空行的文本块打印?
问题:提取指定模式前一行到下一个空行的文本块
需要提取从匹配Processing id: $ID的前一行开始,到下一个空行结束的文本块。现有sed/awk命令仅能从模式行本身开始提取,无法包含模式行的前一行。
输入文件示例
2022/12/28 02:06:29 [Time] Processing id: PATTERN1 multiple lines follow 2023/01/14 04:06:29 [Time] Processing id: PATTERN2 multiple lines follow 2023/02/15 08:07:29 [Time] Processing id: PATTERN3 multiple lines follow 2023/02/16 14:06:29 [Time] Processing id: PATTERN2 multiple lines follow
当前使用的命令
sed命令
sed -n "/Processing id: $ID/,/^$/p" inputfile
awk命令
awk -v myid="$ID" '$0 ~ "Processing id: "myid,/^$/ {print}' inputfile
改进后的解决方案
方案1:awk实现
核心逻辑是缓存上一行内容,匹配到目标模式时先输出缓存的上一行,再进入打印模式直到遇到空行:
awk -v myid="$ID" ' /^$/ { in_block=0 } in_block { print } $0 ~ "Processing id: " myid { print prev; in_block=1 } { prev=$0 } ' inputfile
方案2:sed实现
利用sed的保持空间和分支命令,匹配到目标行时回溯打印上一行,再持续打印到空行:
sed -n -e '/Processing id: '"$ID"'/{x;p;x;}' -e '/Processing id: '"$ID"'/,/^$/p' inputfile
/Processing id: $ID/{x;p;x;}:匹配目标行时,交换保持空间(存着上一行)和模式空间,打印上一行后再交换回来- 后半段命令负责打印从目标行到空行的内容
期望输出
2023/01/14 04:06:29 [Time] Processing id: PATTERN2 multiple lines follow 2023/02/16 14:06:29 [Time] Processing id: PATTERN2 multiple lines follow
内容的提问来源于stack exchange,提问作者trian
相关产品推荐
相关产品推荐

