从日志文件中提取特定单词
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/\..*>/ /; 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
- 启用 E
xtended 正则表达式和 (-n
) 禁用模式空间的打印
^([^.]*)
- 第一个捕获组:从行首 => 不是句号的所有内容 (.
)
.*>
- 第一个捕获组之后的所有内容,直到/包括 >
([^:]*)
- 第二个捕获组:所有非冒号 (:
)
.*\(
- 第二个捕获组之后的所有内容,直到/包括文字 (
([^ ]*)
- 第三个捕获组:所有不是空格的东西
.*$
- 从第三个捕获组到行尾的所有内容
\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 中模式的日志文件名?
从 Window 日志的 .evtx 文件中提取审计事件信息