在连续的行中搜索两个不同的单词,并仅打印两个连续的行

时间:2018-06-26 14:31:29

标签: python bash shell

我有包含不同行的文件。我想搜索两个单词“确定”和“ “ 12.2.1.1.6.180125.1”并打印两行。实际上第一行是主机名,第二行是版本,因此这需要在一起。请告知如何使用python或shell查找?

 ` cat file 

 microcldx0093.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0094.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0031.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0032.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}

microcldx0142.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

microcldx0157.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

microcldx0131.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

microcldx0136.abc.com        : OK
{:output=>"12.1.2.3.4.170111", :exitcode=>0}

`

 ` cat /tmp/1 |grep -e OK -e 12.2.1.1.6.180125.1
   microcldx0093.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0094.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0031.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0032.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
microcldx0142.abc.com        : OK
microcldx0157.abc.com        : OK
microcldx0131.abc.com        : OK
microcldx0136.abc.com        : OK
 `

2 个答案:

答案 0 :(得分:0)

使用AWK

awk 'BEGIN {
    found = 0
}

/OK/ {
    okLine = $0;
    found = 1;
}

/12\.2\.1\.1\.6\.180125\.1/ {
    if (found = 1) {
        print okLine "\n"  $0
    } 
   found = 0
}

{
    found = 0
}' /tmp/1

BEGIN是在读取任何输入之前已匹配的模式。这只是将找到的标志设置为零。

/ OK /模式与您要查找的第一行匹配。这会缓存行并将发现标志设置为1

下一个模式与您的数字匹配。它必须逃脱作为元字符的点。不转义,它们将匹配任何字符。如果找到的标志为1,则前一行必须与OK匹配。所以我们输出两条线。现在,我们重置该标志,以便在我们首先与OK匹配之前不会打印任何内容。

最后一部分将匹配先前检查未匹配的任何内容。这将重置标志,以便我们必须首先再次开始寻找OK。

答案 1 :(得分:0)

您可以尝试: $ cat文件| grep -A1 OK | grep -B1 '12 .2.1.1.6.180125.1'

“ grep -A1”给出包含“ OK”的每一行加上其后的一行,在这些结果中,“ grep -B1”给出包含“ 12.2.1.1.6.180125.1”的行以及之前的一行,这应该给出该对您要查找的行数。

$ cat file | grep -A1 OK | grep -B1 '12.2.1.1.6.180125.1'
 microcldx0093.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
--
microcldx0094.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
--
microcldx0031.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}
--
microcldx0032.abc.com        : OK
{:output=>"12.2.1.1.6.180125.1", :exitcode=>0}