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}'