Linux数据提取分组异常:如何合并port.txt中多行FREE_PORTS至单行
问题描述
有一个复制了命令输出的文本文件port.txt,需要将其解析为竖线分隔的分栏格式。
port.txt的内容如下:
NAME---SERIALNUMBER------FREE_PORTS tx1 s4tx999d 0/1, 0/4,0/6 0/9,0/11 tx2 s4tx998f 1/2,0/9,,1/3 0/8,0/11, 1/7 tx3 s4tx997v 0/9
需要输出的目标格式:
NAME|SERIALNUMBER|FREE_PORTS tx1|s4tx999d|0/1,0/4,0/6,0/9,0/11 tx2|s4tx998f|1/2,0/9,1/3,0/8,0/11,1/7 tx3|s4tx997v|0/9
尝试过用cut命令拆分列,但无法将多行的FREE_PORTS内容聚合到单行:
cat ports.txt | cut -c1-5 -- For The Name cat ports.txt | cut -c6-13 -- For SERIALNUMBER cat ports.txt | cut -14-23 -- For Free ports
求可行的解决方案。
解决方案
可以用awk结合sed来处理这类多行续合的文本,以下是完整命令:
awk ' BEGIN { print "NAME|SERIALNUMBER|FREE_PORTS" } /^[a-z]/ { if (name != "") { printf "%s|%s|%s\n", name, serial, ports ports = "" } name = $1 serial = $2 ports = $3 } /^[[:space:]]+/ { gsub(/^[[:space:]]+/, "", $0) if ($0 != "") { ports = ports "," $0 } } END { printf "%s|%s|%s\n", name, serial, ports }' port.txt | sed 's/,,/,/g; s/,$//'
命令说明
- awk部分:
BEGIN块:先输出目标格式的表头- 匹配以小写字母开头的行(即包含设备名称和序列号的起始行):如果不是第一条数据,先输出上一条的聚合结果;然后提取当前行的
NAME、SERIALNUMBER和初始的端口内容 - 匹配以空白字符开头的行(即端口续行):去掉行首空白,将当前行的端口内容追加到端口变量中,用逗号分隔
END块:输出最后一条设备的聚合结果
- sed部分:
s/,,/,/g:将连续的逗号替换为单个逗号(处理原数据中的空端口项)s/,$//:去掉行尾多余的逗号(处理原数据续行末尾的逗号)
执行该命令后,输出结果会完全符合你的目标格式。
内容的提问来源于stack exchange,提问作者stacktesting
相关产品推荐
相关产品推荐

