linux - 从日志文件中提取属性值并根据属性值将日志存储在单独的文件中

标签 linux awk

我正在尝试根据模式为每个用户生成不同的日志文件。 #

由于日志文件非常大(几百 GB),我想使用 awk 或类似的 shell 命令来有效地处理它。

示例输入日志如下所示:


2019-09-01T06:04:55+00:00 xxxxxxxx CEF: 0|XXX XXXX XXX|YYY-OS|9.0.3|end|TRAFFIC|1|rt=Sep 12 2019 06:04:55 GMT deviceExternalId=11111000000 dvchost=ABCDEFGHIJ src=0.0.0.0 dst=0.0.0.0 sourceTranslatedAddress=0.0.0.0 destinationTranslatedAddress=0.0.0.0 cs1Label=Rule_name cs1=sec_t2u_allow_ssl suser=intra\\test.user1 duser= app=ssl\n

2019-09-01T06:04:55+00:00 xxxxxxxx CEF: 0|XXX XXXX XXX|YYY-OS|9.0.3|end|TRAFFIC|1|rt=Sep 12 2019 06:04:55 GMT deviceExternalId=11111000000 dvchost=ABCDEFGHIJ src=0.0.0.0 dst=0.0.0.0 sourceTranslatedAddress=0.0.0.0 destinationTranslatedAddress=0.0.0.0 cs1Label=Rule_name cs1=sec_t2u_allow_ssl suser=intra\\ts-test.user2 duser= app=ssl\n

2019-09-01T06:04:55+00:00 xxxxxxxx CEF: 0|XXX XXXX XXX|YYY-OS|9.0.3|end|TRAFFIC|1|rt=Sep 12 2019 06:04:55 GMT deviceExternalId=11111000000 dvchost=ABCDEFGHIJ src=0.0.0.0 dst=0.0.0.0 sourceTranslatedAddress=0.0.0.0 destinationTranslatedAddress=0.0.0.0 cs1Label=Rule_name cs1=sec_t2u_allow_ssl suser= duser= app=ssl\n

一些用户名存在,但不是全部。如果“suser=”我想把它放在单独的文件中

预期的输出格式为:


###test.user1.log -->###

2019-09-01T06:04:55+00:00 xxxxxxxx CEF: 0|XXX XXXX XXX|YYY-OS|9.0.3|end|TRAFFIC|1|rt=Sep 12 2019 06:04:55 GMT deviceExternalId=11111000000 dvchost=ABCDEFGHIJ src=0.0.0.0 dst=0.0.0.0 sourceTranslatedAddress=0.0.0.0 destinationTranslatedAddress=0.0.0.0 cs1Label=Rule_name cs1=sec_t2u_allow_ssl suser=intra\\\\test.user1 duser= app=ssl\n

.....

###ts-test.user2.log --> ###

2019-09-01T06:04:55+00:00 xxxxxxxx CEF: 0|XXX XXXX XXX|YYY-OS|9.0.3|end|TRAFFIC|1|rt=Sep 12 2019 06:04:55 GMT deviceExternalId=11111000000 dvchost=ABCDEFGHIJ src=0.0.0.0 dst=0.0.0.0 sourceTranslatedAddress=0.0.0.0 destinationTranslatedAddress=0.0.0.0 cs1Label=Rule_name cs1=sec_t2u_allow_ssl suser=intra\\ts-test.user2 duser= app=ssl\n

.....

###others.log --> ###

2019-09-01T06:04:55+00:00 xxxxxxxx CEF: 0|XXX XXXX XXX|YYY-OS|9.0.3|end|TRAFFIC|1|rt=Sep 12 2019 06:04:55 GMT deviceExternalId=11111000000 dvchost=ABCDEFGHIJ src=0.0.0.0 dst=0.0.0.0 sourceTranslatedAddress=0.0.0.0 destinationTranslatedAddress=0.0.0.0 cs1Label=Rule_name cs1=sec_t2u_allow_ssl suser= duser= app=ssl\n

我试图找到匹配模式的正则表达式。

此正则表达式 "(\bsuser\b)=(.*?(?=\s\w+=|$))" 可用于匹配类似于 "的模式suser=abcd\\ts-test.user"

最佳答案

问题中包含的一些正则表达式运算符在我拥有的 awk 4.1.4 中不可用(例如“(?=)”)。因此正则表达式需要一些修改

这是一个小的单行 awk 脚本,您可以将其用作起点

 awk '
/suser=/ {
    # fallback log file
    logfile = "others.log"
    # Extra user ID to items[1] from $0 '**suser=' token
    if ( match($0, " suser=\\S+\\.(\\w+)", items) ) {
        logfile = items[1] ".log"
    } 
    # print NR, logfile
    print $0 > logfile
}'

关于linux - 从日志文件中提取属性值并根据属性值将日志存储在单独的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58233011/

相关文章:

awk - 使用 awk 查找列是否包含 "|"

awk - 计算文件中的残基数

bash - grep 文件中不同行的多个字符串(即整个文件,而不是基于行的搜索)?

linux - 如何修复在 Ubuntu 上从源代码安装 Apache 时出现的错误 1

linux - 使用 `find` 时如何排除目录?

c++ - CodeSourcery Lite 强制包含到 ARM9/的搜索路径

regex - 合并文本文件中与正则表达式匹配的某些行

Bash 命令从日志文件中获取开始时间和结束时间

linux - 如何将文件复制到我在文件中包含文件名的特定文件夹?

linux - awk group by 并在符合条件时打印