我在windows上使用grep在文件中搜索重复的字符串。我让它或多或少地发挥作用。
我正在用一些IP地址更新一个大批量文件。当我在文件中添加新位置时,有时T1 IP地址不可用,因此该位置的T1 IP为null。因此,我会定期查看列表以更新它们。
我搜索SET T1为空的行。这返回了那些特定的行,所以我添加了-BX以返回站点号所在的X行。这给了我一个文本块,其中包括站点号和null的IP。欢呼进步。
然而,我想进一步过滤,最好只是得到网站号码。
因此,与其得到这个:
:S001
Text I want to skip here
More text here
SET T1=null
--
:S010
我可以得到这个:
:S001
--
:S010
总之,我想找到一个匹配项,然后返回X行,将该行输出到一个文件中,然后转到下一个匹配,重复。
我怀疑我可以通过发呆来实现这一点,但遗憾的是,我的怪癖早已离开了我,所以我不知所措。
您的扩展需求正朝着sed
或awk
(或Perl、Python…,尽管awk
在这里很好)的方向发展;CCD_ 4不再合适。
awk '/^:S.*/ { site = $1; next } /SET T1=null/ { print site }'
捕获以:S
开头的行(根据需要进行更严格的处理——例如,/^:S[0-9]{3}$/
可能只查找包含:S
和3位数字的行),并将名称保留在变量site
中。当遇到SET T1=null
行时,打印site
的当前值——最近遇到的站点名称。如果您的输入数据比预期的要小,您可以根据需要添加一些提示,使其更加健壮。在本例中,您可以省略next
;这是一个小的优化。
@Jonathan Leffler好的,谢谢乔纳森让我走上了正确的道路。
我只要稍微调整一下就能得到我想要的东西。主要是因为我在Windows上使用GNUwin32软件包,而不是在linux/unix上。
C:Program FilesGnuWin32bin>gawk "/^:S.*/ { site = $1; next } /SET T1=null/ { print site }" c:file.txt >c:match.txt