Sto cercando di analizzare un file di testo generato da uno script expec che
richiama alcune informazioni da uno switch.
Ecco un esempio di output:
192 0000.0000.0000 1/g23 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
Il file di testo contiene molti altri file spazzatura che non mi interessano. Voglio solo le righe che contengono il numero dello switch e la porta - "1/g23" nell'esempio sopra.
Ho eseguito un grep sul file per estrarre le righe che contengono il pattern '/g'
e funziona benissimo.
Ora tutto ciò che voglio sono le due colonne centrali.
Ho usato awk per stampare le colonne.
0000.0000.0000 1/g23
Ora che è fatto, voglio fare un giro del '.'
sed ha funzionato bene per questo
000000000000 1/g23
Da qui voglio convertire solo la prima colonna in un formato di indirizzo MAC.
So this
000000000000 1/g23
Becomes this
00:00:00:00:00:00 1/g23
Sono stato in grado di trovare un comando sed che avrebbe realizzato questo. Ma il mio problema è che ho bisogno che sia fatto solo sulla prima colonna. Non sono del tutto sicuro di come posso modificare solo una colonna e non perdere l'associazione tra il MAC e la porta.
grep -e "/g" switch6output | awk '{print $2,$3}' | sed 's/.//g' | sed 's/../&:/g;s/:$//'
Sono sicuro che questo è un modo davvero stupido di farlo, ma è stato il meglio che potevo inventare. Esiste un modo più affidabile per ottenere ciò di cui ho bisogno senza perdere l'associazione MAC e porta?
Grazie.
Risposta accettata:
Basta usare awk direttamente:
awk '//g/ {
gsub(/./, "", $2)
gsub(/../, "&:", $2)
sub(/:$/, "", $2)
print $2,$3
}'
Con questa soluzione non hai bisogno di grep
né sed
.