从日志文件中提取特定单词

Posted

技术标签:

【中文标题】从日志文件中提取特定单词【英文标题】:Extract specific words from a log file 【发布时间】:2021-10-12 01:05:58 【问题描述】:

现有日志文件:

00:00:00.035790 0x7ff488dfa700>INFO: Session(ABC_BETA -1): 0.000494 Type Info
00:24:00.035799 0x7ff488dfa700>DEBUG: Session(ABC_BETA -1): 1.000000 Type Debug
01:02:00.035801 0x7ff488dfa700>INFO: Session(2NDStage -1): 0.000133 Type Info
21:00:00.035803 0x7ff488dfa700>INFO: Session(jOHN -1): 0.000140 Type Info
23:59:00.035805 0x7ff488dfa700>INFO: Session(NIRVANA -1): 0.003880 Type Info

预期结果:

00:00:00 INFO ABC_BETA
00:24:00 DEBUG ABC_BETA
01:02:00 INFO 2NDStage
21:00:00 INFO jOHN
23:59:00 INFO NIRVANA

我能够使用 sed 的组合提取它,如下所示:

sed 's/[\.\>\)\( \]//g'<testfile.log|cut -d "" -f 1,4,6|sed 's// /g'|sed 's/: / /g'

只是想知道是否有更好的方法来做到这一点?

【问题讨论】:

不需要的部分用一个空格代替:sed 's/\..*&gt;/ /; s/: .*(/ /; s/ -1).*//' file 【参考方案1】:
$ awk -F'[.> (]|: ' 'print $1, $4, $6' file
00:00:00 INFO ABC_BETA
00:24:00 DEBUG ABC_BETA
01:02:00 INFO 2NDStage
21:00:00 INFO jOHN
23:59:00 INFO NIRVANA

【讨论】:

【参考方案2】:

所有的sed

sed -re 's/([0-9:]8)[^>]+>([^:]+): Session[(]([^ ]+) .*[)].*/\1 \2 \3/' test.txt

结果:

00:00:00 INFO ABC_BETA
00:24:00 DEBUG ABC_BETA
01:02:00 INFO 2NDStage
21:00:00 INFO jOHN
23:59:00 INFO NIRVANA

【讨论】:

【参考方案3】:

这可能对你有用(GNU sed):

sed -E 's/\.[^(]*\((\S+).* (\S+)$/ \U\2\E \1/' file

模式匹配并使用\U\E 仅将最后一个字段大写。

【讨论】:

【参考方案4】:

另一个sed想法:

sed -En 's/^([^.]*).*>([^:]*).*\(([^ ]*).*$/\1 \2 \3/p' test.log

地点:

-En - 启用 Extended 正则表达式和 (-n) 禁用模式空间的打印 ^([^.]*) - 第一个捕获组:从行首 => 不是句号的所有内容 (.) .*&gt; - 第一个捕获组之后的所有内容,直到/包括 &gt; ([^:]*) - 第二个捕获组:所有非冒号 (:) .*\( - 第二个捕获组之后的所有内容,直到/包括文字 ( ([^ ]*) - 第三个捕获组:所有不是空格的东西 .*$ - 从第三个捕获组到行尾的所有内容 \1 \2 \3/p - 使用单个空格作为分隔符打印我们的捕获组

这会生成:

00:00:00 INFO ABC_BETA
00:24:00 DEBUG ABC_BETA
01:02:00 INFO 2NDStage
21:00:00 INFO jOHN
23:59:00 INFO NIRVANA

【讨论】:

以上是关于从日志文件中提取特定单词的主要内容,如果未能解决你的问题,请参考以下文章

如何从日志文件路径中提取变量,测试 Logstash 中模式的日志文件名?

从日志文件中提取源 IP

无法从日志文件中提取准确的键值对

从 Window 日志的 .evtx 文件中提取审计事件信息

使用 awk getline bash 在指定的时间范围内从日志文件中提取数据

用于从文本日志文件中提取/检索值的 Shell 脚本(sqlcode 字段值)