2014-12-08 84 views
0

如果第二行与“Minion没有返回”相匹配,我需要处理第一行。我的文字如下:shell脚本中的文本处理

t-dat-collectorsrv-1a.2014_12_01_11_23: 
    True 
t-dat-postprocessorsrv-1a.2014_04_29_10_02: 
    True 
t-dat-collectorsrv-1a.2014_12_03_10_15: 
    Minion did not return 
t-dat-collectorsrv-1a.2014_12_03_10_27: 
    Minion did not return 
t-dat-collectorsrv-1a.2014_12_03_10_38: 
    Minion did not return 

每当我得到“爪牙没有回”我想要得到的第一线“T-DAT- *”,并希望做一些处理。如何根据第二行打印的输出分隔第一行?

+0

到目前为止您有任何代码吗? – CorbinMc 2014-12-08 05:48:34

回答

0

您可以使用awk在它前面的线与行为保存当前行的模式匹配:

$ awk '/Minion did not return/{print prev;prev=$0}{prev=$0}' inputFileName 

t-dat-collectorsrv-1a.2014_12_03_10_15: 
t-dat-collectorsrv-1a.2014_12_03_10_27: 
t-dat-collectorsrv-1a.2014_12_03_10_38: 

在上面的成绩单,它只是打印出前行,但你可以做更复杂还有东西:

$ awk ' 
    /Minion did not return/ { 
     print gensub(/^[^.]*\.(....).(..).(..).(..).(..).*$/, 
      "\\1-\\2-\\3 \\4:\\5", "g", prev); 
     prev=$0 
    } 
    { 
     prev=$0 
    }' qq.in 

2014-12-03 10:15 
2014-12-03 10:27 
2014-12-03 10:38 
+0

谢谢paxdiablo!这就像一个魅力。我想学习'sed'和'awk',但是发现大多数链接更混乱。你能告诉我一些关于我应该参考哪本书或链接的见解吗? – 2014-12-08 06:30:43

+0

@ user2964886,为了学习'sed'和'awk',我有一本我很喜欢的书,只要我能记住这个名字。 ...就是这样,它被称为“sed&awk”:-) http://shop.oreilly.com/product/9781565922259.do。如果你不想掏出死树版的辛苦钱财,可以看看http://www.gnu.org/software/gawk/manual/gawk.html。 – paxdiablo 2014-12-08 06:39:08