将 txt 文件处理为 CSV 的脚本

将 txt 文件处理为 CSV 的脚本

我正在尝试/尝试编写一个脚本来解决这个问题:

Mikrotik01#show unique routing entry | 192.168.255.232 | inc ID
Thu June 10 15:21:32.808 CST
 Unique Entry: 192.168.255.21
 Unique Entry: 192.168.255.233
 Unique Entry: 192.168.255.155
Mikrotik01#show unique routing entry | 192.168.255.233 | inc ID
Thu June 10 15:21:33.079 CST
 Unique Entry: 192.168.255.234
 Unique Entry: 192.168.255.232
Mikrotik01#show unique routing entry | 192.168.255.234 | inc ID
Thu June 10 15:21:33.347 CST
 Unique Entry: 192.168.255.233
 Unique Entry: 192.168.255.235

转换为包含以下内容的 CSV:

192.168.255.232,192.168.255.21,192.168.255.233,192.168.255.155
192.168.255.233,192.168.255.234,192.168.255.232
192.168.255.234,192.168.255.233,192.168.255.235

基本上,它会从第一行开始一个新行,然后在同一行上用逗号添加每个相邻路由器 ID,直到到达包含“Mikrotik”主机名的下一行,在该行中它将创建一个新行并继续执行整个文件。最终结果为 csv。

答案1

awk -F'[[:blank:]|]+' '
    /^Mikrotik01/ {if (NR>1) print ""; printf "%s", $(NF-2)} 
    /Unique Entry/ {printf ",%s", $NF}
    END {print ""}
' file.txt > File.csv

答案2

在第一次关闭时,它可以是sed-script:

sed -E '
/Mikrotik01/{s/.* ([0-9.]{7,}) .*/\1/;x;/^$/!b}
/[0-9.]{7,}/!d
s/.* ([0-9.]{7,}).*/\1/
x
G
s/\n/,/
h
$!d' file.txt > file.csv

或者(可能更短一点但不是那么强 - 它通过|not by识别新行块Mikrotik01

sed -E '
  /^T/d
  s/^[^.]*[|:] //
  / \|.*$/{s///;x;/^$/!b}
  x
  G
  s/\n/,/
  $!{h;d}' file.txt > file.csv

它可以被简化(因为我做了两次相同的xand s/),但现在我无法想象如何简化。

相关内容