从输出中提取一种模式或另一种模式 - 而不是整行

时间:2014-03-27 20:02:41

标签: regex bash sed awk grep

对于我眼前的即时任务,我试图从nmap ping扫描中提取特定输出,但这个问题可能更符合一般的满足感,因为我似乎并没有"得到它& #34;

简单地打印与这些精确图案匹配的线条非常容易,但我想做的不仅仅是这些。

例如

nmap -sP 1.2.3.4 | awk '/seems down/ || /is up/{print}'

会给我

Note: Host seems down If it is really up, but blocking our ping probes, try -Pn

Host is up (0.025s latency)

基本上我只想提取"主机似乎已关闭"或者#34;主持人已经开始了#34;一部分。更具体地说,我想剔除"主机[中间的任何内容]向下或向上",因为有时不同版本的nmap会给出不同的输出(但总是有单词Host,down或up) 。就像有一种方法可以匹配并显示以Host开头的任何模式,以向下或向上结束,然后停在那里。我认为这可以通过sed one-liner完成,但到目前为止,我只能删除" Host" " down"或者" up" ...这意味着我只是向后退一步。虽然我缺乏正则表达式,sed和awk经验是最让我失望的原因。

非常感谢任何指导。

3 个答案:

答案 0 :(得分:0)

使用sed可能更容易:

sed -nr '/seems down|is up/s/^.*(Host [a-z]+ (down|up)).*$/\1/p' file
Host seems down
Host is up

答案 1 :(得分:0)

使用grep:

的版本
grep -oP '(Host.*down|Host.*up)'

或显示首次出现“向下”或“向上”的版本。 Host(down|up)之间的非贪婪匹配。

grep -oP 'Host.*?(down|up)'

打印

Host seems down
Host is up

甚至更精确,

grep -oP 'Host.*?\b(down|up)\b'

是什么使单词“向下”和“向上”单词边界,所以对于输入

Note: Host seems upper down If it is really up, but blocking our ping probes, try -Pn

打印

Host seems upper down

答案 2 :(得分:0)

为什么不使用grep:

nmap 1.2.3.4 | grep -oP '[hH]ost (up|seems down)'