当我运行时,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