如何从多行日志条目的不同行中获取 awk 中的两个字段?

如何从多行日志条目的不同行中获取 awk 中的两个字段?

我正在解析来自网络服务器的日志文件,试图将日志条目的一行上的 IP 地址与同一日志条目的另一行上出现的用户名关联起来。

我有如下所示的日志条目,因此存在很大的 JSON 块。第一部分是第一行的用户 ID,后面始终是相同格式的额外日志信息,最后的行是 IP 地址,然后是更多内容(不包括)。

awk 可以处理多行吗,或者我应该考虑将第一项放入内存变量中并在第二个字段通过时输出它?

2017-08-11 17:12:53.763 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : Principal [[email protected]] user ID =='pqr-xyz-coredev'
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : No GoP header [Gop-User] for [email protected]
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : User [pqr-xyz-coredev] details obtained.
 {
    "username": "pqr-xyz-coredev",
    "password": "[PROTECTED]",
    "country": null,
    "department": null,
    "title": null,
    "email": null,
    "enabled": true,
    "accountNonExpired": true,
    "credentialsNonExpired": true,
    "accountNonLocked": true,
    "grantedAuthorities": [
        "GBSUD101 SUPPORT",
        "RG OAG WE1-T1-01234 ADM"
    ]
}
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 URI: /data/load/REF.SWE.RUN.ALL.M.KBD/2017-08-11 GET
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'host': rsadffs199.abc1.com:10040
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'user-agent': PycURL/7.43.0 libcurl/7.52.1 WinSSL zlib/1.2.8
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'accept': */*
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 AUTHORIZATION: hash not displayed
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 PARAM 'endDate': 2099-12-31
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 PARAM 'startDate': 1900-01-01
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 REMOTE ADDRESS: 101.16.75.75

答案1

尝试以下awk

awk -F"[=':]" '/user ID/{userID=$(NF-1)} /REMOTE ADDRESS/{print userID"," $NF}' `infile.txt

输出:

pqr-xyz-coredev, 101.16.75.75

答案2

perl -F"\h+|'" -lane '
   /\huser\h+ID\h/ and $a = $F[-1];
   /\hREMOTE\h+ADDRESS:\h/ and print "$a $F[-1]";
' log.file
  • Perl选项:
    • -F"\h+|'"这会在一系列水平空格或单引号字符上分割当前行。这确保了我们要查找的信息始终可以在最后一个字段中找到。
    • -l这会将 设置ORS为换行符,并将 也设置IRS为换行符。
    • -a这将根据选项提供的字段分隔符分割输入记录-F,或者默认为空格。从当前记录中划分出来的字段存储在数组中@F
    • -n这将设置一个隐式输入文件读入循环+禁用将记录自动打印到标准输出。
  • user ID当我们遇到一条两边都有水平空白的线时,我们会继续记住存储在最后一个字段中的用户 ID,即 ., $F[-1]
  • 当我们遇到水平线REMOTE ADDRESS:且两侧都以水平线为界时。空格,我们继续打印之前存储的用户 ID 以及该行的最后一个字段,该字段将保存 IP 地址。

结果:

pqr-xyz-coredev 101.16.75.75

相关内容