awk -F'[[:blank:]|]+' '
/^Mikrotik01/ {if (NR>1) print ""; printf "%s", $(NF-2)}
/Unique Entry/ {printf ",%s", $NF}
END {print ""}
' file.txt > File.csv
Estou tentando / tentando escrever um script para transformar isso:
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
Em um CSV que contém:
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
Basicamente, ele iniciará uma nova linha com a primeira linha e, em seguida, adicionará cada uma das ID do roteador na mesma linha com uma vírgula até atingir a próxima linha que contém o "Mikrotik" hostname onde criaria uma nova linha e continuaria pelo arquivo inteiro. Resultado final em um csv.
Eu tenho olhado para isso o dia todo e estou apenas preso. Qualquer sugestão seria ótima e muito apreciada. Mesmo uma sugestão na direção certa.
awk -F'[[:blank:]|]+' '
/^Mikrotik01/ {if (NR>1) print ""; printf "%s", $(NF-2)}
/Unique Entry/ {printf ",%s", $NF}
END {print ""}
' file.txt > File.csv
No primeiro fechamento, pode ser sed
-script:
sed -E '
/Mikrotik01/{s/.* ([0-9.]{7,}) .*//;x;/^$/!b}
/[0-9.]{7,}/!d
s/.* ([0-9.]{7,}).*//
x
G
s/\n/,/
h
$!d' file.txt > file.csv
Ou (pode ser mais curto, mas não tão strong - ele reconhece um novo bloqueio de linha em |
, não em Mikrotik01
)
sed -E '
/^T/d
s/^[^.]*[|:] //
/ \|.*$/{s///;x;/^$/!b}
x
G
s/\n/,/
$!{h;d}' file.txt > file.csv
Pode ser simplificado (porque eu faço duas vezes mesmo x
e s/
) mas agora não consigo imaginar como.