我正在尝试根据模式为每个用户生成不同的日志文件。 #
由于日志文件非常大(几百 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/