如何在含重复匹配串的文件中获取目标匹配行的前后指定行数内容
解决匹配目标行前后内容时遗漏后续行的问题
当文件中存在两个相同的匹配字符串(如示例中的RECORD)时,需要显示第一个匹配行(示例第10行的RECORD)的前10行与后10行内容。但使用grep -m 1 -B 10 -A 10 RECORD *命令时,仅能输出第1至14行,无法获取包含第15至20行的完整预期结果。
示例文件内容
<Test1> </Test1> <Test2> </Test2> <Test3> </Test3> <Test4> </Test4> <Test5> </Test5> <Test6> </Test6> <Test7> </Test7> <Test8> </Test8> <Test9> </Test9> <Test10> **RECORD** </Test10> <Test11> </Test11> <Test12> </Test12> <Test13> </Test13> <Test14> </Test14> <Test15> RECORD </Test15> <Test16> </Test16> <Test17> </Test17> <Test18> </Test18> <Test19> </Test19> <Test20> </Test20>
问题原因
grep -m 1参数会让grep在找到第一个匹配行后停止匹配操作,部分版本的grep在输出-A 10的后续内容时,若遇到第二个匹配行,会提前终止输出,导致无法完整获取第一个匹配行的后10行内容。
解决方案
使用awk命令可精准控制输出范围,确保包含第一个匹配行的前10行到后10行的所有内容:
awk '/RECORD/ && !found {start=NR-10; end=NR+10; found=1} NR>=start && NR<=end' 文件名
命令解释
/RECORD/ && !found:匹配到RECORD且是第一次匹配时触发逻辑start=NR-10; end=NR+10; found=1:计算输出的起始(当前行-10)和结束(当前行+10)行号,标记已找到目标匹配NR>=start && NR<=end:只要当前行号在起始和结束范围内,就输出该行内容
预期输出
<Test1> </Test1> <Test2> </Test2> <Test3> </Test3> <Test4> </Test4> <Test5> </Test5> <Test6> </Test6> <Test7> </Test7> <Test8> </Test8> <Test9> </Test9> <Test10> **RECORD** </Test10> <Test11> </Test11> <Test12> </Test12> <Test13> </Test13> <Test14> </Test14> <Test15> RECORD </Test15> <Test16> </Test16> <Test17> </Test17> <Test18> </Test18> <Test19> </Test19> <Test20> </Test20>
内容的提问来源于stack exchange,提问作者matrix1395
相关产品推荐
相关产品推荐

