我有包含不同行的文件。我想搜索两个单词“确定”和“ “ 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
`
答案 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}