linux - 如何使 bash 脚本从关键字生成日志文件

标签 linux bash csv logging

我试图用 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/

相关文章:

linux - 如何在ubuntu中为常用的终端命令制作快捷方式

linux - 如何在 bash 中将命令和选项存储在单独的变量中

c# - 仅将 csv 中的重复记录插入数据库

python - 合并公共(public)列匹配的两个 csv 文件

c# - asp.net 将 CSV 字符串转换为字符串[]

c++ - 构建自定义编译库的更好方法

linux - pids为什么会在容器中跳跃?

bash - tmux:在 bash 脚本中在 Pane 中运行命令并捕获结果

Ubuntu 上的 Bash 脚本 - 空闲时间超过 5 分钟时写入日志条目

C++ udp recvfrom 减少滴