【问题标题】:Epoch to normal date AWK纪元到正常日期 AWK
【发布时间】:2014-10-10 23:23:32
【问题描述】:

在我的 awk 输出中(放置在 php 中)我需要将纪元时间转换为正常时间,请问 scriptm 有什么问题? Apache 错误日志:sh: 1: 语法错误:未终止的带引号的字符串

$result = shell_exec("grep -i 'SERVICE ALERT' /home/den/-".$date."-00.log | sed 's/ SERVICE ALERT:/;/g; s/^.//g;s/]//g' | awk -F ';' '/WARNING|CRITICAL/ {print 'date -d@'$1',$2,$3,$4}' | sort | uniq  -c | sort -nr | head -10");

【问题讨论】:

  • awk -F ';' '/WARNING|CRITICAL/ {print 'date -d@'$1',$2,$3,$4}' 显然是错误的。您不能执行这样的外部命令。检查converting dates in awk

标签: php shell awk


【解决方案1】:

GNU awk 有一些内置的时间函数:

gawk '{print strftime("%F %T", $1), $2, $3, $4}' <<END
1234567890 foo bar baz
END
2009-02-13 18:31:30 foo bar baz

您必须在巨大的双引号 shell 命令中以某种方式转义这些双引号。并且由于您是根据日期时间排序的,因此请使用"%Y%m%d-%H%M%S"

之类的格式

由于 awk 可以做 grep 和 sed 所做的事情,我会将这些命令折叠到 awk 中以稍微减少管道。您可以决定它是提高还是降低可维护性。

我对 PHP 不够熟悉,不知道它是否可以处理此处显示的额外空格:

$result = shell_exec(
            "gawk -F ';' '
                ! /SERVICE ALERT/ {next} 
                {gsub(/ SERVICE ALERT:/, ";"); sub(/^./, ""); gsub(/\]/,""); $1=$1}
                /WARNING|CRITICAL/ {print strftime("%F %T", $1),$2,$3,$4}
            ' /home/den/-".$date."-00.log | sort | uniq  -c | sort -nr | head -10"
);

【讨论】:

  • $result = shell_exec("grep -i 'SERVICE ALERT' /home/den/-".$date."-00.log | sed 's/ SERVICE ALERT:/;/g; s/^.//g;s/]//g' | awk -F ';' '/WARNING|CRITICAL/ '/WARNING|CRITICAL/ {print $1, $2, $3, $4}' | sed 's/ ^.*([0-9]\{10\}).*/date -d@\\1/' | sh | sort | uniq -c | sort -nr | head -10");我用 date -d 做了 sed,但脚本只输出带日期的列,而且我还需要输出列 $2 $3 $4,也许你能帮帮我?
  • 我确实帮助了你。你试过了吗?
  • 我不明白我应该把这个 gawk 放在哪里
猜你喜欢
  • 2012-04-28
  • 2012-11-28
  • 2016-05-20
  • 2021-12-20
  • 2018-12-14
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多