我试图用 bash 脚本从一个复杂的文件制作 1 个日志文件 CSV,我试过了,但只是从日志文件中找到了关键字,请帮助我。
超过(10k 行)的复杂日志文件示例:
"$date1" "url=$a1&http=$a2&ip=$a3&from=$a4"
"$date2" "url=$b1&http=$b2&from=$a4&sip=$b5"
"$date3" "url=$c1&http=$c2&ip=$c3&UID=$c6&K-Id=c8"
"$date4" "http=$d2&ip=$d3&from=$d4&utm_id=$d7"
我找到了关键字并将其制作成这样的文件:
url
http
ip
from
sip
UID
utm_id
我必须找到如何将 bash 脚本制作成这样的 csv 文件:
DATE URL HTTP IP FROM SIP UID utm_ID K_id
$date1 a1 a2 a3 a4
$date2 b1 b2 b4 b5
$date3 c1 c2 c3 c6 c8
$date4 d1 d2 d3 d4 d7
请帮帮我。
最佳答案
这是一个用 gawk 编写的可行示例,已使用您问题中的数据进行测试。
log.awk
/.*=.*/ { # ignore all lines without url parameters
for (i=5;i<NF;i+=2)
d[substr($2,0,10)][$i]++
# if your date format is 2017-02-09T06:15:24.349847Z, change to
# d[$2][$i]++
}
END {
for (i in d) {
for (j in d[i]) {
t[j]++ # find all paramters
}
}
# print header
printf "DATE"
for (p in t) {
printf "\t\t%s",toupper(p)
}
printf "\n"
for (i in d) {
printf "%s",i
for (p in t) {
if (p in d[i]) {
printf "\t\t%s",d[i][p]
} else {
printf "\t\t"
}
}
printf "\n"
}
}
将上面的内容保存为文件log.awk
,然后在你的bash shell中运行
$ gawk -F '["&=?]' -f log.awk little-output.log
DATE HTTP FROM UTM_ID URL K-ID UID IP SIP
$date1 1 1 1 1
$date2 1 1 1 1
$date3 1 1 1 1 1
$date4 1 1 1 1
此处粘贴的结果格式不正确,但在您的 shell 输出中结果很好,或者您可以将输出重定向到文件。
关于linux - 如何使 bash 脚本从关键字生成日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42710142/