我正在使用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早就离开了我,所以我不知所措。
答案 0 :(得分:2)
您的扩展要求朝着sed
或awk
(或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