(awk)将模式 1 和模式 2 的第二次出现之间的内容写入单独的文件

(awk)将模式 1 和模式 2 的第二次出现之间的内容写入单独的文件
errors=$(mktemp -d) || exit 1

cat "$logFile" | awk -v d=$errors '/ ERROR /, /********************************************************************************/ {if ($0 ~ / ERROR /) {n++} ; print > d "/" n}'

这会将 ERROR 和第一次出现 **************************************************************************************** 之间的行写入单独的文件,但我需要写入直到第二次出现 ****************************************************************************************。如何使用 awk 完成此操作?

输入 $logFile 的简化示例

2021-02-04T07:26:31,246+0000    ERROR 
********************************************************************************
CONTENT
********************************************************************************

2021-02-04T07:26:31,248+0000    ERROR 
********************************************************************************
CONTENT
********************************************************************************

期望的输出是

文件 1

2021-02-04T07:26:31,246+0000    ERROR 
********************************************************************************
CONTENT
********************************************************************************

文件 2

2021-02-04T07:26:31,248+0000    ERROR 
********************************************************************************
CONTENT
********************************************************************************

答案1

这有效

errors=$(mktemp -d) || exit 1

cat "$logFile" | awk -v d=$errors '/ ERROR /, /\*\*\*\*/ && i++ {if ($0 ~ / ERROR /) {j++}; if (i <= 2) print > d "/" j; if (i == 2) i = 0}'

解释

将 $logFile 的内容通过管道传输到 awk

cat "$logFile" | awk

将 awk 变量 d 设置为临时文件夹

-v d=$errors 

第一个匹配的模式

'/ ERROR /,

第二种模式匹配,匹配时增加计数器 i (猜测 * 必须转义,因为它是通配符,不会费心转义所有通配符)

/\*\*\*\*/ && i++

不太清楚这有什么用,但它应该增加每个 ERROR 行的计数器 j。

{if ($0 ~ / ERROR /) {j++};

现在,如果 i 计数器小于或等于 2,我们将该行打印到 d 文件夹中,并以 j 作为文件名

if (i <= 2) print > d "/" j;

最后,当第二个 /****/ 发生时,i 应该是 2,因此我们将其重置为 0

if (i == 2) i = 0}'

相关内容