如何优雅实现grep多组匹配结果输出之间插入空白行?
grep分组输出的优化实现方案
你原有命令存在两处冗余:一是两次读取目标文件,二是多余的cat管道(grep支持直接传入文件路径作为参数),以下是不同场景的优雅实现:
方案1:最小改动简化版(逻辑完全对齐原实现)
仅裁剪冗余逻辑,输出和原命令完全一致,易读性高,适合小文件场景:
grep -e foo file && printf '\n' && grep -e bar file
提示:如果需要不管foo是否匹配到结果,都固定输出空行分隔再输出bar的匹配结果,把命令中的
&&替换为;即可。
方案2:单awk实现(仅遍历一次文件,效率更高)
处理大文件时优先选择,仅做一次IO读取,性能优势明显:
awk '/foo/; /bar/ { bar_lines = bar_lines $0 ORS } END { print ""; printf "%s", bar_lines }' file
逻辑说明:
- 遍历文件时遇到foo匹配行直接打印
- 遇到bar匹配行暂存到变量中
- 遍历完成后先打印空行,再输出所有暂存的bar匹配行
方案3:多模式通用拓展版
如果后续需要新增更多匹配分组,不需要叠加多个grep命令,直接拓展规则即可:
awk ' BEGIN { # 按输出顺序配置匹配规则,可自由新增 patterns[0] = "foo" patterns[1] = "bar" } { for (idx in patterns) { if ($0 ~ patterns[idx]) { res[idx] = res[idx] $0 "\n" } } } END { for (i = 0; i < length(patterns); i++) { if (i > 0) print "" # 不同分组之间打印空行分隔 printf "%s", res[i] } } ' file
内容的提问来源于stack exchange,提问作者cyrille_
相关产品推荐
相关产品推荐

