除了awk substr截取,如何更好解析含空格多列的CLI命令输出?
更健壮的解析方案
针对你遇到的带空格的Value列解析问题,以下几种方法比固定位置截取更可靠,无需依赖输出的列偏移(比如第68位):
方法1:用awk移除前三个字段及分隔符
直接跳过表头行,通过正则匹配移除开头的Id、Name、Iid三个字段及其后的分隔符,保留剩余所有内容:
show attributes attr=0x1006e mh=0x12003ea | awk 'NR==1 {next} {sub(/^[^\t ]+[ \t]+[^\t ]+[ \t]+[^\t ]+[ \t]+/, ""); print}'
- 逻辑:
NR==1 {next}跳过表头;正则^[^\t ]+[ \t]+匹配单个字段(兼容空格或制表符分隔),连续三次匹配后替换为空,剩下的就是完整的Value内容。
方法2:awk遍历拼接第4到最后一个字段
如果确定Value从第4个字段开始,遍历拼接所有后续字段并处理末尾空格:
show attributes attr=0x1006e mh=0x12003ea | awk 'NR>1 { val = "" for(i=4; i<=NF; i++) val = val $i " " sub(/ $/, "", val) # 移除末尾多余空格 print val }'
- 逻辑:
NF是当前行的字段总数,从第4个字段开始逐个拼接,最后去掉拼接产生的末尾空格。
方法3:结合tr和cut处理
先压缩多空格为单空格,再按空格分隔截取第4及以后的字段:
show attributes attr=0x1006e mh=0x12003ea | grep -v "Id" | tr -s ' ' | cut -d' ' -f4-
- 逻辑:
grep -v "Id"跳过表头;tr -s ' '把连续空格压缩成单个;cut -d' ' -f4-截取第4个到最后的所有字段。
这些方法的优势是不依赖固定列位置,如果后续Id、Name的长度变化,解析逻辑依然有效,比substr($0,68)更健壮。
内容的提问来源于stack exchange,提问作者DanL
相关产品推荐
相关产品推荐

