.gz 文件日志中 txt 列表的大 grep
Big grep from txt list in .gz file logs
这是我的问题(对我来说其实是个大问题)。
我有一个包含 1.130.395 行的 txt 文件,如下例所示:
10812
10954
10963
11070
11099
10963
11070
11099
betti.bt
betti12
betti1419432307
19442407
19451970
19461949
我有大约 2000 个 .gz 日志文件。
我需要对 .txt 文件的每一行都对所有 .gz 文件执行 grep。
这是 gz 文件内容的示例,示例行:
time=2019-02-28 00:03:32,299|requestid=30ed0f2b-9c44-47d0-abdf-b3a04dbb560e|severity=INFO |severitynumber=0|url=/user/profile/oauth/{token}|params=username:juvexamore,token:b73ad88b-b201-33ce-a924-6f4eb498e01f,userIp:10.94.66.74,dtt:No|result=SUCCESS
time=2019-02-28 00:03:37,096|requestid=8ebca6cd-04ee-4818-817d-30f78ee95731|severity=INFO |severitynumber=0|url=/user/profile/oauth/{token}|params=username:10963,token:1d99be3e-325f-3982-a668-30494cab9a96,userIp:10.94.66.74,dtt:No|result=SUCCESS
txt 文件包含用户名。
我需要在 gz 文件中搜索 url 和 "profile" 参数以及 "result=SUCCESS".
的用户名
如果发现什么,只写入日志文件:
username found; name of the log file in which it was found
可以做点什么吗?
我知道我需要使用 zgrep 命令,但有人可以帮助我....可以自动执行该过程吗?
谢谢大家
使用 getline
重写。它读取并散列 file.txt
用户名,然后压缩 gzip 作为参数给定,split
s 直到获取带有 username:
的字段,提取实际用户名并从散列中搜索它。未经过适当测试等标准免责声明。让我知道它是否有效:
$ cat script.awk
BEGIN{
while (( getline line < ARGV[1]) > 0 ) { # read the username file
a[line] # and hash to a
}
close(ARGV[1])
for(i=2;i<ARGC;i++) { # read all the other files
cmd = "gunzip --to-stdout " ARGV[i] # form uncompress command
while (( cmd | getline line ) > 0 ) { # read line by line
m=split(line,t,"|") # split at pipe
if(t[m]!="result=SUCCESS") # check only SUCCESS records
continue
n=split(t[6],b,/[=,]/) # username in 6th field
for(j=1;j<=n;j++) # split to find it, set to u var:
if(match(b[j],/^username:/)&&((u=substr(b[j],RSTART+RLENGTH)) in a)) {
print u,"found in",ARGV[i] # output if found in a hash
break # exit for loop once found
}
}
close(cmd)
}
}
运行它(使用相同数据的2份):
$ awk -f script.awk file.txt log-0001.gz log-0001.gz
10963 found in log-0001.gz
10963 found in log-0001.gz
我会做(未经测试):
zgrep -H 'url=/user/profile/oauth/{token}|params=username:.*result=SUCCESS' *.gz |
awk -F'[=:,]' -v OFS=';' 'NR==FNR{names[[=10=]];next} in names{print , }' names.txt - |
sort -u
或者可能更有效一点,因为它删除了 zgrep 输出的每一行的 NR==FNR
测试:
zgrep -H 'url=/user/profile/oauth/{token}|params=username:.*result=SUCCESS' *.gz |
awk -F'[=:,]' -v OFS=';' '
BEGIN {
while ( (getline line < "names.txt") > 0 ) {
names[line]
}
close("names.txt")
}
in names{print , }' |
sort -u
如果给定的用户名在给定的日志文件中只能出现一次,或者如果您确实希望多次出现以产生多行输出,那么您不需要最后的 | sort -u
.
这是我的问题(对我来说其实是个大问题)。
我有一个包含 1.130.395 行的 txt 文件,如下例所示:
10812
10954
10963
11070
11099
10963
11070
11099
betti.bt
betti12
betti1419432307
19442407
19451970
19461949
我有大约 2000 个 .gz 日志文件。
我需要对 .txt 文件的每一行都对所有 .gz 文件执行 grep。
这是 gz 文件内容的示例,示例行:
time=2019-02-28 00:03:32,299|requestid=30ed0f2b-9c44-47d0-abdf-b3a04dbb560e|severity=INFO |severitynumber=0|url=/user/profile/oauth/{token}|params=username:juvexamore,token:b73ad88b-b201-33ce-a924-6f4eb498e01f,userIp:10.94.66.74,dtt:No|result=SUCCESS
time=2019-02-28 00:03:37,096|requestid=8ebca6cd-04ee-4818-817d-30f78ee95731|severity=INFO |severitynumber=0|url=/user/profile/oauth/{token}|params=username:10963,token:1d99be3e-325f-3982-a668-30494cab9a96,userIp:10.94.66.74,dtt:No|result=SUCCESS
txt 文件包含用户名。 我需要在 gz 文件中搜索 url 和 "profile" 参数以及 "result=SUCCESS".
的用户名如果发现什么,只写入日志文件:
username found; name of the log file in which it was found
可以做点什么吗? 我知道我需要使用 zgrep 命令,但有人可以帮助我....可以自动执行该过程吗?
谢谢大家
使用 getline
重写。它读取并散列 file.txt
用户名,然后压缩 gzip 作为参数给定,split
s 直到获取带有 username:
的字段,提取实际用户名并从散列中搜索它。未经过适当测试等标准免责声明。让我知道它是否有效:
$ cat script.awk
BEGIN{
while (( getline line < ARGV[1]) > 0 ) { # read the username file
a[line] # and hash to a
}
close(ARGV[1])
for(i=2;i<ARGC;i++) { # read all the other files
cmd = "gunzip --to-stdout " ARGV[i] # form uncompress command
while (( cmd | getline line ) > 0 ) { # read line by line
m=split(line,t,"|") # split at pipe
if(t[m]!="result=SUCCESS") # check only SUCCESS records
continue
n=split(t[6],b,/[=,]/) # username in 6th field
for(j=1;j<=n;j++) # split to find it, set to u var:
if(match(b[j],/^username:/)&&((u=substr(b[j],RSTART+RLENGTH)) in a)) {
print u,"found in",ARGV[i] # output if found in a hash
break # exit for loop once found
}
}
close(cmd)
}
}
运行它(使用相同数据的2份):
$ awk -f script.awk file.txt log-0001.gz log-0001.gz
10963 found in log-0001.gz
10963 found in log-0001.gz
我会做(未经测试):
zgrep -H 'url=/user/profile/oauth/{token}|params=username:.*result=SUCCESS' *.gz |
awk -F'[=:,]' -v OFS=';' 'NR==FNR{names[[=10=]];next} in names{print , }' names.txt - |
sort -u
或者可能更有效一点,因为它删除了 zgrep 输出的每一行的 NR==FNR
测试:
zgrep -H 'url=/user/profile/oauth/{token}|params=username:.*result=SUCCESS' *.gz |
awk -F'[=:,]' -v OFS=';' '
BEGIN {
while ( (getline line < "names.txt") > 0 ) {
names[line]
}
close("names.txt")
}
in names{print , }' |
sort -u
如果给定的用户名在给定的日志文件中只能出现一次,或者如果您确实希望多次出现以产生多行输出,那么您不需要最后的 | sort -u
.