Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk日志文件中的日期到历元,并打印其他列_Bash_Perl_Awk_Timestamp_Epoch - Fatal编程技术网

Bash awk日志文件中的日期到历元,并打印其他列

Bash awk日志文件中的日期到历元,并打印其他列,bash,perl,awk,timestamp,epoch,Bash,Perl,Awk,Timestamp,Epoch,我有一个日志文件,需要在其中输出日期和一些状态代码。我还使用| |作为分隔符,并从数据中删除不需要的符号。下面是它的样子: cat logfile.log | awk 'BEGIN { FS = "\\|\\|" } { gsub("/","-") sub(":", " ") gsub("\\[", "") gsub("\\+0000]", "")}; { print $15 $12 }' | uniq -c 这将产生: 22 25-Jan-2016 01:53:52 85.10.2

我有一个日志文件,需要在其中输出日期和一些状态代码。我还使用| |作为分隔符,并从数据中删除不需要的符号。下面是它的样子:

cat logfile.log | awk 'BEGIN { FS = "\\|\\|" } { gsub("/","-")  sub(":", " ") gsub("\\[", "") gsub("\\+0000]", "")}; { print $15 $12 }' | uniq -c
这将产生:

  22  25-Jan-2016 01:53:52  85.10.210.199
  1   25-Jan-2016 01:53:52   66.249.93.77
  18  25-Jan-2016 01:53:52   85.10.210.199
  1   25-Jan-2016 01:53:52   88.232.191.231
在此之后,我需要将时间转换为历元,并且仍然打印列$1和$3

我想实现:

  22  1453686832  85.10.210.199
  1   1453686832   66.249.93.77
  18  1453686832   85.10.210.199
  1   1453686832   88.232.191.231
我可以将日期转换为历元,但我丢失了其他列。我怎样才能让它们也随着时间而变化

这是我的原始日志文件:

[] ||  ||  ||  || [] || http || 40080 || 176.237.167.102 || [] || [-] || [0.072] || 176.237.167.102 || - || - || [25/Jan/2016:06:30:26 +0000] || "POST /checknewmsg HTTP/1.1" || 200 || 265 || 895 || "http://google.com/post” || "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36" || "-" || [TR]

由于您有点不愿意在您的问题中提供所需的信息,idk如果这是您正在寻找的,请使用GNU awk for
mktime()


如果我通过date-d“$date”+%s打印日期,我会丢失第一列和第三列。如果您有GNU awk,您也可以使用它显示原始数据,因为您的awk命令对于您要获取的数据来说有点复杂。您有GNU awk吗@123-你的意思是
mktime()
,而不是
strftime()
。如果我们有
strtime()
但我们没有。无论如何,对于OP:Post,将生成您发布的输出的示例输入发布。
gsub()
的第一个参数是一个regexp,顺便说一句,不是一个字符串,因此如果您向它传递一个regexp,那么awk不必将字符串转换为regexp,因此您不需要双重转义元字符,例如,您应该执行
gsub(/\[/,“”)而不是
gsub(\\[,“”)
。现在使用一个需要regexp的字符串,您为自己和awk付出了双倍的努力。好了,现在您已经编辑了您的问题,但是您只提供了一行输入,这与任何一行预期输出都不对应。看,这非常简单-发布几行示例输入和您想要的输出从输入中获取。不要向我们显示一组输入,然后显示您希望从完全不同的输入中获取的输出-这没有用。是的,这是,但我需要计算uniq时间戳的行数,而不是IP地址,即使它们已打印。我使用GNU awk。非常感谢!再次感谢(最后一次)编辑您的问题,以提供示例输入和给定该输入的预期输出。尤其包括一个案例,其中您有多个IP地址用于1个时间戳,因为您根本没有描述您在该案例中的输出要求,并且您可能希望以各种方式处理它。
$ cat tst.awk
BEGIN { FS="\\s*[|][|]\\s*" }
{
    split($15,a,/[][\/: ]/)
    a[3] = (match("JanFebMarAprMayJunJulAugSepOctNovDec",a[3])+2)/3
    secs = mktime(a[4]" "a[3]" "a[2]" "a[5]" "a[6]" "a[7])
    cnt[secs OFS $12]++
}
END {
    for (key in cnt) {
        print cnt[key], key
    }
}

$ cat file
[] ||  ||  ||  || [] || http || 40080 || 176.237.167.102 || [] || [-] || [0.072] || 176.237.167.102 || - || - || [25/Jan/2016:06:30:26 +0000] || "POST /checknewmsg HTTP/1.1" || 200 || 265 || 895 || "http://google.com/post” || "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36" || "-" || [TR]

$ awk -f tst.awk file
1 1453725026 176.237.167.102