在Grep中跳过线

时间:2016-06-02 23:23:03

标签: bash awk grep

我正在使用Windows上的grep在文件中搜索重复的字符串。我已经或多或少地工作了。

我正在使用一些IP地址更新大型批处理文件。当我在文件中添加新位置时,有时T1 IP地址不可用,因此该位置的T1 IP为null。所以我会定期回到列表中来更新它们。

我搜索SET T1 = null的行。返回那些特定的行,所以我添加了-BX以返回站点号所在的X行。这给了我一个文本块,其中包括站点号和null的IP。万岁的进步。

但是我想进一步过滤掉它,最好只得到网站号。

所以不要这样做:

:S001
Text I want to skip here
More text here
SET T1=null
--
:S010

我能得到这个:

:S001
--
:S010

总结一下,我想找到一个匹配,然后回到X行,将该行输出到一个文件,没有别的,转到下一个匹配,重复。

我怀疑我能用gawk实现这一目标,但是我的awk fu早就离开了我,所以我不知所措。

2 个答案:

答案 0 :(得分:2)

您的扩展要求朝着sedawk(或Perl,Python,......,但这里的awk正常)方向前进; grep不再合适。

awk '/^:S.*/ { site = $1; next } /SET T1=null/ { print site }'

捕获从:S开始的行(根据需要使其更严格 - 例如,/^:S[0-9]{3}$/可能会查找包含:S和3位数的行),并保留名称变量site。遇到SET T1=null行时,请打印site的当前值 - 最近遇到的网站名称。如果您的输入数据比预期的更加脆弱,您可以根据需要添加铃声和口哨声,以使其更加强大。您可以在此示例中省略next;这是一个小小的优化。

答案 1 :(得分:0)

@Jonathan Leffler 好的,谢谢Jonathan让我走上了正确的道路。

我能够通过一点点调整得到我正在寻找的东西。主要是因为我在Windows上使用GNUwin32软件包而不是linux / unix。

C:\Program Files\GnuWin32\bin>gawk "/^:S.*/ { site = $1; next } /SET T1=null/ { print site }" c:\file.txt >c:\match.txt