【问题标题】:Log Parsing using awk and sed使用 awk 和 sed 进行日志解析
【发布时间】:2020-09-13 00:27:30
【问题描述】:

我有

2019-11-14T09:42:14.150Z  INFO ActivityEventRecovery-1 ActivityCacheManager - - [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Handling activity 0082bc26-70a6-433e-a470-
2019-11-14T09:43:08.097Z  INFO L2HostConfigTaskExecutor2 TransportNodeAsyncServiceImpl - FABRIC [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Calling uplinkTeamingChangeListener.onTransportNodeUpdated on TN 72f73c66-da37-11e9-8d68-005056bce6a5 revision 5
2019-11-14T09:43:08.104Z  INFO L2HostConfigTaskExecutor2 Publisher - ROUTING [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Refresh mac address of Logical router port connected with VLAN LS for logical router LogicalRouter/f672164b-40cf-461f-9c8d-66fe1e7f8c19
2019-11-14T09:43:08.105Z  INFO L2HostConfigTaskExecutor2 GlobalActivityRepository - - [nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"] Submitted activity 73e7a942-73d2-4967-85fa-7d9d6cc6042b in QUEUED state with dependency null exclusivity true and requestId null and time taken by dao.create is 1 ms

我想将这些日志解析为 json 对象。到目前为止,我一直在使用 python 正则表达式并将其放入字典中。

    currentDict = {
                               "@timestamp" : regexp.group(1),
                               "Severity" : regexp.group(2),
                               "Thread" : regexp.group(3),
                               "Class" : regexp.group(4),
                               "Message-id" : regexp.group(5),
                               "Component" : regexp.group(6),
                               "Message" : regexp.group(7),
                               "id's" : re.findall(x[1], regexp.group(7))
                        }

但这种方式非常慢,即 200mb 文件需要 5-10 分钟。

我使用的 Python 正则表达式 - (\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ)\s+(INFO|WARN|DEBUG|ERROR|FATAL|TRACE)\s+(.*?)\s+(.*?)\s+\-\s+(.*?)\s+(?:(\[?.*?\])?)\s(.*)

预期输出 -

{"@timestamp" : "2019-11-14T09:42:14.150Z", "Sevirity" : "INFO", "Thread" : "ActivityEventRecovery-1", "Class" : "ActivityCacheManager - -", "Component" : "[nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"]", "Message" : "Handling activity 0082bc26-70a6-433e-a470-"}
{"@timestamp" : "2019-11-14T09:43:08.097Z", "Sevirity" : "INFO", "Thread" : "L2HostConfigTaskExecutor2", "Class" : "TransportNodeAsyncServiceImpl - FABRIC", "Component" : "[nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"]", "Message" : "Calling uplinkTeamingChangeListener.onTransportNodeUpdated on TN 72f73c66-da37-11e9-8d68-005056bce6a5 revision 5}"}
{"@timestamp" : "2019-11-14T09:43:08.104Z", "Sevirity" : "INFO", Thread : "L2HostConfigTaskExecutor2", "Class" : "Publisher - ROUTING", "Component" : "[nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"]", Message : "Refresh mac address of Logical router port connected with VLAN LS for logical router LogicalRouter/f672164b-40cf-461f-9c8d-66fe1e7f8c19}"}
{"@timestamp" : "2019-11-14T09:43:08.105Z", "Sevirity" : "INFO", "Thread" :  "L2HostConfigTaskExecutor2", "Class" :   "GlobalActivityRepository", "Component" : "[nsx@6876 comp="nsx-manager" level="INFO" subcomp="manager"]", "Messages" : "Submitted activity 73e7a942-73d2-4967-85fa-7d9d6cc6042b in QUEUED state with dependency null exclusivity true and requestId null and time taken by dao.create is 1 ms"}}

在互联网上,我发现使用 awk 和 sed 可以更快地完成。我对此了解不多。如何使用awksed进行解析。

请帮忙!

【问题讨论】:

  • 能否请您在您的帖子中发布预期输出示例,然后让我们知道。
  • @RavinderSingh13 添加了预期输出
  • 您的预期输出与您给定的输入不匹配

标签: regex bash logging awk sed


【解决方案1】:
# For timestamp
cut -d " " -f 1 in > temp
sed -i -e 's/^/{"@timestamp" : "/' temp
awk 'NF{print $0 "\", "}' temp > a

# For Severity ...

# For Thread ...

# For Class
cut -d " " -f 5,6,7 in > temp
sed -i -e 's/^/"Class" : "/' temp
awk 'NF{print $0 "\", "}' temp > d

# For Component
grep -o -P '(?<=\[).*(?=\])' in > temp
sed -i -e 's/^/"Component" : \["/' temp
awk 'NF{print $0 "\"], "}' temp > e

# For Message ...

# Merge all files line by line
paste -d " " a b c d e f

我将简要解释一下这个脚本,cut 用于将单词放在两个空格之间。 Sed 将文本添加到每行的开头。 awk 正在将文本添加到每行的末尾。

我已离开严重性、线程和消息部分,因为它们与其他部分相同。该脚本相当简单,但如果不知道如何使用工具本身,您将无法理解它,因为您说您不了解它们。

【讨论】:

  • 我在文本文件中有日志。如何从文本文件中获取输入?
  • 文件名为“in”,其中包含日志。只需将文本文件重命名为 in,或将脚本中的 filaname 从“in”更改为“somefilename”
【解决方案2】:

这个 sed 脚本应该做的很快:

sed -E 's/^([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+\s-\s[^ ]+)\s+(\[.*\])\s+(.*)$/{"@timestamp" : "\1", "Severity" : "\2", "Thread" : "\3", "Class" : "\4", "Component" : "\5", "Message" "\6"}/' inputdata.dat

解释:

  • sed 's/^&lt;regular-expression&gt;$/&lt;output-string&gt;/' 操作/替换每个匹配正则表达式的^&lt;input-line&gt;$。在此^ 表示开始$行尾
  • -E :表示使用扩展的正则表达式。扩展的正则表达式现在包含在 POSIX 中。 在 grep 的手册页中可以找到:

    基本与扩展正则表达式:

    基本正则表达式中 元字符 ?、+、{、|、( 和 ) 失去了它们的特殊含义; 而是使用反斜杠版本\?、\+、\{、\|、\(和\)。

  • (...)...(...)...(...)...(...) 中的内容是 - 在此脚本中 - 与第一个、第二个、第三个...第六个数据字段匹配的描述。一般来说,它是一种将整个正则表达式细分为不同单元的工具,您可以通过\1\2... 在输出字符串中引用这些单元。这样做,您可以将文本操作限制在某些上下文中。在这种情况下,数据字段本身保持不变,只有上下文会改变。

  • [^ ]+ :在[...] 中描述了一个字符类 [A-Za-z0-9] 表示正好是一个字母或数字字符[0-9]+ 表示至少一个数字[ ] 表示一个空白[^0-9 ] 表示正好是一个字符——除了数字和空白之外的任何其他字符,所以这里[^ ]+ 表示至少一个字符 - 除了空白之外的任何其他字符 -> 前三个数据字段内容的正确正则表达式模式
  • ([^ ]+\s-\s[^ ]+):第四个数据字段“Class”是一个复合数据字段,两个组件和一个分隔符' - '(第一个 - 2nd),在字符类之外([..])使用\s而不是' '
  • (\[.*\]) :第五个数据字段“组件”也是一个复合数据字段,但包含在方括号 [] 中。为了匹配括号字符本身(不是通过将这些字符括在括号中的 char 类),您必须使用括号字符 [] 前面加上反斜杠 \. 是一个通配符,所以.* 中的\[.*\] 表示括号之间的所有内容
  • \s+ : 至少一个空格或制表符(在数据字段之间)
  • 所以第六个数据字段-灵活长度的消息-可以匹配为(.*)什么意思后面的其余部分]和紧随其后的空格直到行尾
  • \1 ... \6(在右侧):输出字符串中对正则表达式中各个表达式组(在本例中为数据字段)的引用。
  • inputdata.dat : 用你的数据文件名替换它

为了获得可运行的 shell 脚本,将其保存为文件:

#! /bin/sh
sed -E 's/^([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+\s-\s[^ ]+)\s+(\[.*\])\s+(.*)$/{"@timestamp" : "\1", "Severity" : "\2", "Thread" : "\3", "Class" : "\4", "Component" : "\5", "Message" "\6"}/' "$1" >"$2"

之后运行命令chmod +x &lt;your-scriptname&gt; 使脚本可执行。 然后可以运行./&lt;your-scriptname&gt; &lt;input-file&gt; &lt;wanted-output-file-name&gt;

注意:

  • 输入和输出文件不要使用相同的文件名
  • 如果具有输出文件名的文件已经存在,它将被覆盖。

【讨论】:

  • 脚本中出现了一个小错误,抱歉!现在它应该运行了。
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 2021-04-24
  • 2011-04-07
  • 2011-12-27
  • 2013-11-26
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多