2015-11-20 65 views
0

这是我使用从“my_file”提取某些REC的码片:匹配的记录通过相反的顺序

awk '/Exception/ && !/ExceptionUnparseable date/ { 
     haveEx="yes"; ex=$0; **exDate=last**} 
    haveEx && /tms/ { 
     print exDate; print ex; haveEx=""} 
    {last = $0} ' my_file 

我的要求是。 exDate = last - >我的代码的这一部分应该存储记录,这个记录对我的匹配来说是prevust。但不幸的是有时需要检查比赛前的许多记录。

所以总之,我需要匹配“最后”记录到“正则表达式”\^[0-9] [0 - ] * \如果它不匹配,那么我需要向后移动一条记录,比如直到我的reg - exp比赛。如果它的匹配我需要将该记录存储在变量“exDate”中,如上所述。

我到目前为止所做的事情是尝试在awk中放入一个if条件,但不知道如何追踪越来越多,直到req匹配。

+0

你只想存储一个匹配给定的正则表达式的记录“最后”?所以只有当你的记录与该表达式匹配时,“{last = $ 0}”动作,不是? –

+0

我无法得到你所说的。但我可以用一个例子来解释我的要求。此外,我还没有在问题中添加正则表达式代码。 last是一个awk变量,它将前一条记录提交给匹配。 如果匹配“/ Exception/&&!/ ExceptionUnparseable date /”,那么它将获取上一行作为日期。 在某些情况下它是一个日期,在某些情况下,前一个匹配的行是日期。在某些情况下甚至更早。总之我需要回去,直到检查我的匹配的前一条记录是一个日期 –

+0

正确的是,您将上一行保存在'last'中。 *每条*行都被存储。你不希望每一行都被存储。你只需要*匹配*行来存储。因此,不要使用无条件的'{last = $ 0}'操作,将您的正则表达式模式用作该操作的模式,并且只存储与您的正则表达式匹配的行。 '/^[0-9] [0 - ] */{最后= $ 0}' –

回答

3

您可以存储独立于其他模式匹配的日期模式,并在该模式满足时打印。这样你就不需要回头查询了。如果我正确理解你的问题,这应该工作

$ awk '/^[0-9-]*$/{lastDate=$0} 
     /pattern1/{exDate=lastDate; lastDate=""} 
pattern2/&&exDate{print exDate}' << EOF 
> asdf 
> asdf 
> 2015-11-20 
> asdfa 
> pattern1 
> asdfa 
> asdfa 
> pattern2 
> asdf 
> asdf 
> EOF 
2015-11-20 
+0

。这就是即使fedorqui说的答案,再次感谢您花时间。 –