如何用awk提取Board Info及其下属缩进文本块(无需硬编码结束行)
用Awk提取指定缩进格式的文本块
需求说明
需要从大文件中提取一段文本块:
- 起始行是恰好2个空格开头的
Board Info:行 - 包含后续所有以4个空格开头的下属内容
- 终止条件:遇到下一行是恰好2个空格开头的任意内容(无需硬编码终止行内容)
示例目标文本块:
Board Info: #512 Manufacturer: "Dell Inc." Product: "0X3D66" Version: "A02" Serial: "..CN7016343F00IE."
(终止行为 Chassis Info: #768,无需提取该行)
现有尝试的问题
- 命令
awk '/^\s{2}Board Info/,/^\s{2}[^B ]/' dump.txt:
仅能处理终止行不以字母B开头的场景,若终止行是BOM:这类内容会失效。 - 命令
awk '/^\s{2}Board Info/,/^\s{2}\S*/' dump.txt:
终止模式会匹配起始行本身,导致仅提取Board Info:单行,无法获取下属缩进内容。
解决方案
通过**状态标记(flag)**实现精准匹配,逻辑如下:
- 匹配到起始行时,开启标记并打印该行
- 标记开启时,检查当前行:若为2个空格开头的非空白行(同级别行)则关闭标记;否则打印当前行(下属缩进内容)
精准匹配空格的命令(推荐)
awk ' /^ Board Info:/ { flag=1; print; next } flag { if (/^ \S/) { flag=0 } else { print } } ' dump.txt
兼容任意空白字符的命令(若文本可能混用制表符)
awk ' /^\s{2}Board Info:/ { flag=1; print; next } flag { if (/^\s{2}\S/) { flag=0 } else { print } } ' dump.txt
命令解释
- 第一行:匹配到2个空格开头的
Board Info:行,设置flag=1(开启提取状态),打印该行后跳过后续判断。 - 第二块:当
flag为1时,检查当前行是否是2个空白字符后接非空白字符(同级别起始行):- 若是:关闭
flag,停止提取 - 若否:打印当前行(即4空格开头的下属内容)
- 若是:关闭
内容的提问来源于stack exchange,提问作者BoomDizzle
相关产品推荐
相关产品推荐

