我正在编写一个Bash脚本来解析Postgres错误日志,并提取特定日期/时间之间的日志条目。复杂的因素是条目可以是多行的,只有第一行包含时间戳。日志条目看起来像这样:
第一个月
其中<message>
可以是1行或多行。<msgtype>
是ERROR
,STATEMENT
,DETAIL
等。几乎任何<msgtype>
都可以有任何数量的行。
Awk将在命令行上处理多个文件,虽然文件中的行是按时间戳顺序排列的,但文件不一定是这样。(awk '{if ($1 >= "$first") { print } }'
)* 其中$first
被设置为开始时间戳。为$last
添加检查是微不足道的,问题是获取那些不以时间戳开始的行,而只有那些跟在一个匹配的后面的人。
有人能给我指出正确的方向吗?
- 它只是根据我,这将只比较日期,而不是时间,所以有人可以帮助这一部分,以及?我可以做
awk '{if ( ($1" "$2) >= "$first") { print } }'
?
预计到达时间:样本日志条目:
2023-11-07 07:01:25 UTC::@:[605]:ERROR: could not connect to the publisher: connection to server at "<ip addr>", port 5432 failed: FATAL: pg_hba.conf rejects replication connection for host "<ip addr>", user "<userid>", SSL on
connection to server at "<ip addr>", port 5432 failed: FATAL: pg_hba.conf rejects replication connection for host "<ip addr>", user "<userid>", SSL off
字符串
2条答案
按热度按时间bvjxkvbb1#
这可能是你正在尝试做的事情,但是没有有用的示例输入/输出来演示你的所有需求,这是基于多个假设的猜测:
字符串
您可能希望也可能不希望收紧我正在使用的日期+时间正则表达式,这取决于日志文件中行开头可能存在的其他内容。
bmp9r5qi2#
问题是获取那些不以时间戳开头的行,并且只获取那些跟在匹配时间戳之后的行。
您可以在GNU
AWK
中使用RS
(行分隔符),考虑以下简单示例,让file.txt
字符串
你的任务是提取2023年第二个月的条目,然后
型
给出输出
型
说明:我使用
RS
,它应该匹配条目日期,并且只匹配文件中的条目日期,它假设日志仅与2023年有关,并且在随后的位置中允许的数字有限,尽管它仍然可能匹配一些无意义的日期,例如2023-01-37。然后我过滤dt
在所需范围内的日期和printf
给定日期的内容($0
),独立于我在变量dt
中存储RT
(行终止符),因为我需要在过滤过程中考虑 previous 行的行终止符。