【发布时间】:2021-09-12 05:53:12
【问题描述】:
可以在 Ubuntu 21.04 上毫无问题地在 shell 脚本中运行以下命令:
grep -h "new tip" logs/node.log | tail -1000 | sed -rn "s/\[(.*)\].\[(.*)\].* ([0-9]+)/\2,\3/p" | awk -F, -v threshold=2 '{"date +%s.%3N -d\""$1"\""|getline actualTime; delay=actualTime-$2-1591566291; sum+=delay; if (delay > threshold ) print $1 " " delay;} END {print "AVG=", sum/NR}'
但是当我在 Ubuntu 20.04.2 上运行完全相同的脚本时,我得到了这个错误:
/bin/sh: 1: Syntax error: Unterminated quoted string
这绝对是完全相同的脚本,因为我从 21.04 到 20.04.2 对它进行了 scp。在 stackoverflow 或整个互联网上找不到解决此差异的任何主题。两个 Ubuntu 都在 Linux 云服务器上。关于没有错误运行脚本的唯一方法是取出 awk 行:"date +%s.%3N -d\""$1"\""|getline actualTime;
我尝试使用对$1 字段的引用,但没有任何效果。尝试使用nawk 而不是awk,但没有运气。也许作为最后的手段,我可以将操作系统从 v 20 升级到 v 21。
有人见过吗?
补充:感谢大家的快速回复。这是脚本运行的日志文件的第一行
[Relaynod:cardano.node.ChainDB:Notice:60] [2021-06-30 02:20:14.36 UTC] 链扩展,新提示:de56b9f458e8942ca74c6a1913dc58fa896823dc19b366285e15481f434ed337 在插槽 33453323 [Relaynod:cardano.node.ChainDB:Notice:60] [2021-06-30 02:20:15.17 UTC] 链扩展,新提示:e88ea4f438944bd15186fe93f321c117ec769cfbd33667654634f4510cfd3780 在插槽 33453324
只是为了确保这不是数据问题。我在 Ubuntu 21 服务器上针对文件运行脚本(有效),然后将文件复制到 Ubuntu 20 服务器并针对复制的文件运行完全相同的脚本,然后得到错误。
我会尝试一下关于这个话题的建议,然后让大家知道答案。
新的更新:笔记本电脑崩溃和更换后,记得回到这个帖子。我最终像 Ed 提到的那样使用 mktime。它现在正在工作。
shell脚本:
#!/bin/bash grep -h "新提示" 日志/node.log |尾-1000 | sed -rn "s/[(.)].[(.)].* ([0-9]+)/\2,\3/p" | mawk -F, -v 阈值=2 -f check_delay.awk
awk 脚本:
BEGIN{ ENVIRON["TZ"] = "UTC"; }
{
year = substr($1,1,4);
month = substr($1,6,2);
day = substr($1,9,2);
hour = substr($1,12,2);
min = substr($1,15,2);
sec = substr($1,18,2);
timestamp = year" "month" "day" "hour" "min" "sec;
actualTime=mktime(timestamp) + 7200;
delay=actualTime-$2-1591566291;
sum+=delay;
if (delay >= threshold )
print $1 " " delay;}
END {print "AVG=", sum/NR}
【问题讨论】:
-
一些您遇到错误的示例数据会很有用。
-
@Cardsfan:操作系统版本当然无关紧要。 shell 版本可能会有所不同,尽管我在这里也没有看到任何语法问题.... POSIX shell 版本也不会发展得那么快。我会计算两边的 SHA 或 MD5 并进行比较。
-
当你使用 awk 时不需要 sed,并且当你有 GNU awk 时你不需要生成一个子 shell 来调用 date(因为你使用的是 GNU sed) .如果您使用自己的 minimal reproducible example 发布一个新问题,包括 logs/node.log 的示例内容和预期的输出,那么我们可以帮助您做任何您想做的事情。
-
I see 你从来没有接受过你提出的任何问题的答案。请阅读stackoverflow.com/help/someone-answers,然后重新查看您之前的问题。
-
在 Ubuntu 20.04 新的 Docker 映像上没有复制。由于缺乏调试细节而投票结束。如果您想进一步追求这一点,可能会尝试将有问题的脚本缩减为更简单的脚本;另请参阅提供minimal reproducible example 的指南。
标签: linux shell awk ubuntu-20.04