扩展 awk -v 变量

扩展 awk -v 变量

当我运行时,awk '/2017-12-05T12:07:33.941Z/{y=1;next}y' file.json它按预期工作,打印时间戳之后的所有内容。

我正在尝试遵循此语法问答但我的语法没有正确扩展:

awk -v last_log="$last_log" '/{print last_log}/{y=1;next}y' file.txt

还尝试:

awk -v last_log="$last_log" '/$0 ~ last_log/{y=1;next}y' file.txt

例如,给定以下输入,返回最后处理后的所有日志(2017-12-05T12:07:33.941Z):

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12189, "level": 20, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T10:07:33.941Z", "v": 0 }

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12188, "level": 50, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T12:07:33.941Z", "v": 0 }

{ "name": "PeriodicWork", "hostname": "myHost", "pid": 12187, "level": 40, "msg": "Executing [CheckFailedTask NodeId=8]", "time": "2017-12-05T12:57:33.941Z", "v": 0 }

答案1

在这里,我不认为您打算将其2017-12-05T12:07:33.941Z视为正则表达式(其中.将匹配任何字符而不仅仅是.)。

对于子字符串匹配,与正则表达式匹配相反,您可以使用index()

LAST_LOG="$last_log" awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' file.txt

如果变量包含反斜杠,我ENVIRON更喜欢-v破坏-v变量的内容(正如您引用的问答中已经指出的)。

关于你失败的原因:

/{print last_log}/

作为一个状况, 匹配与{print last_log}正则表达式匹配的记录,但这不是有效的正则表达式({是需要用作{2}or {1,5}... 的正则表达式运算符)。

在:

/$0 ~ last_log/

再次,它尝试作为正则表达式进行匹配$0 ~ last_log。这意味着包含的行0 ~ last_log 行尾 ( $),因此永远不会匹配。你的意思可能是:

awk -v last_log="$last_log" '$0 ~ last_log {y=1;next};y' file.txt

那就是状况是一个$0 ~ last_log表达式,而不是一个 regexp /foo//foo/是 的缩写$0 ~ /foo/,即将foo正则表达式与完整记录进行匹配。

您可以执行$0 ~ var,但不能var单独执行,因为它不是正则表达式匹配,而是如果var包含 0 以外的数字或非空非数字字符串(例如您的y一)

答案2

使用 awk 间隔

从last_log到eof也可以通过“,”运算符获取;

 awk  '$0 ~ last, 0'  last="$last_log" file.txt

使用像所呈现的那样的last_log值

 awk "/$last_log/,0" file.txt

可能我们需要添加| tail -n +1

使用 Sed:

sed  "1,/$last_log/d"  file.txt

相关内容