Linux 日志输出提取未正确分组

问题描述 投票:0回答:1

我有一个文本文件,其中复制了命令输出。我需要解析单独列中的文本文件。

我在文本文件 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

I require the output in the below format

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

我尝试使用以下命令,但它没有将所有 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
bash shell awk sed
1个回答
0
投票

我将利用 GNU

AWK
来完成此任务,让
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

然后

awk 'BEGIN{RS="\n\n";ORS=""}{gsub(/\n[ \t]+/,",");gsub(/[ \t-]{3,}/,"|");print}' 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

说明:我通知 GNU

AWK
空行(即两个后续换行符)是行分隔符 (
RS
),因此整个文件被视为单行。然后我使用
gsub
,第一个将跨多行的端口转换为单行,第二个用于将分隔符(空格,TAB或破折号,3个或更多示例)更改为
|
剪切字段。然后我使用
print
输出更改后的内容,观察我将输出字段分隔符 (
OFS
) 设置为空行,否则将添加尾随换行符。如果您必须以任何价格清除它们,请注意保留空格前缀和空字符串端口,然后添加第三个
gsub
来执行此操作。

(在 GNU Awk 5.1.0 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.