如何在Windows版GNU Grep中结合多字符串搜索与匹配后打印后续行并输出到同一文件
如何在Windows版GNU Grep中结合多字符串搜索与匹配后打印后续行并输出到同一文件
嘿,我懂你的需求啦——你想同时实现两个搜索逻辑:一是匹配word1或word2的行直接输出,二是匹配word3的行要连带后面6行一起输出,最后把所有结果汇总到同一个文件里对吧?
其实这个需求用GNU Grep分两步就能轻松搞定,直接把两个命令的结果合并到同一个文件就行,具体操作如下:
方法一:分两次执行Grep(简单直观)
首先执行第一个搜索命令,把匹配word1/word2的行写入输出文件(用>会覆盖原有内容):
grep -i -a -h -E "word1|word2" INfilename.log* > "OUTfilename.txt"
接着执行第二个搜索命令,把匹配word3及后续6行的内容追加到同一个文件末尾(用>>不会覆盖之前的内容):
grep -i -a -h -A 6 "word3" INfilename.log* >> "OUTfilename.txt"
这样操作后,你就能得到想要的结果:word1和word2的匹配行单独显示,word3的匹配行加上后面6行也会出现在文件里。
如果你的输出文件之前已有内容,担心干扰结果,可以先清空它:
- 在Windows CMD里执行:
type nul > "OUTfilename.txt" - 在Git Bash/Cygwin里执行:
> "OUTfilename.txt"
方法二:保持行顺序的进阶方案(可选)
上面的方法有个小问题:如果原日志里word3的行在word1/word2的行前面,分两次执行会导致结果里word1/word2的行先出现,打乱了原文件的顺序。如果需要严格保持原文件的行顺序,你可以用awk来一次性处理(虽然不是纯Grep,但更高效):
awk '/word1|word2/{print; next} /word3/{print; for(i=0;i<6;i++){getline; print}}' INfilename.log* > "OUTfilename.txt"
这个命令会按原文件顺序扫描,遇到word1/word2直接打印,遇到word3则打印该行及后面6行,完美符合你的需求。
备注:内容来源于stack exchange,提问作者minu
相关产品推荐
相关产品推荐

