受限Bash环境下使用grep获取匹配行及上方3行记录的实现方法
受限Bash环境下匹配目标行及前置指定行的实现方案
前提说明
当前受限环境仅支持grep、sed等基础工具,不需要awk即可实现需求,核心目标是搜索到111AA2026匹配行的同时,取出匹配行上方3行的record名称行。
注意事项
你之前用到的grep keyword filename -b3属于参数误用:
- 小写
-b参数的作用是输出匹配内容的字节偏移量,无法返回前置行 - 获取匹配行上方N行需要使用大写
-B参数,基础写法为grep -B 3 "关键词" 文件名
实现方案
方案1:基于grep实现(写法简单)
如果文件体积不大,直接用grep加后置过滤即可得到符合要求的输出:
grep -B3 "111AA2026" 你的文件名 | grep -E '(<record name|Symbol.*111AA2026)' | sed '0~2 s/$/\n--/' | sed '$d'
逻辑说明:
- 用
-B3取出匹配行及上方3行内容 - 二次grep仅保留record行和Symbol匹配行
- 每两行后加分隔符
--,最后删除末尾多余的分隔符
方案2:基于sed实现(大文件效率更高)
流式处理不需要缓存全量结果,大文件场景下性能优于grep方案:
sed -n 'h;n;h;n;h;n;/111AA2026/{x;p;x;p;a -- }' 你的文件名 | sed '$d'
逻辑说明:
- 连续3次执行
h(存当前行到暂存空间)+n(跳转到下一行),定位到Symbol所在的第四行位置 - 如果当前行匹配目标关键词,就取出暂存空间里的record行输出,再输出当前匹配行,添加分隔符
- 最后删除末尾多余的分隔符
输出效果
两种方案输出结果和预期完全一致:
<record name="111111H2" /> <field name="Symbol" value="111AA2026"/> -- <record name="111111N1" /> <field name="Symbol" value="111AA2026"/> -- <record name="111111Q1" /> <field name="Symbol" value="111AA2026"/> -- <record name="111111U1" /> <field name="Symbol" value="111AA2026"/> -- <record name="111111Z1" /> <field name="Symbol" value="111AA2026"/>
内容的提问来源于stack exchange,提问作者louis xie
相关产品推荐
相关产品推荐

