Sto cercando di riformattare un file di registro in modo tale che la data e l'ora appaiano all'inizio della riga. I miei log hanno questo aspetto:
blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
Vorrei che assomigliassero a questo:
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Sono arrivato al punto di trovare il modello grep giusto con grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt
.
Come posso spostare questi risultati del modello a sinistra della stringa di informazioni? Grazie per il tuo aiuto.
Risposta accettata:
Prova sed
con la seguente regex:
$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Qui abbiamo usato il sed
's metodo di sostituzione del gruppo per ottenere l'output desiderato.
\(.*\)
corrisponderà ablah, blah, blah
come abbiamo,[[:blank:]]
per abbinare,
dopo.\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)
corrisponderà alla porzione rimanente della linea (la porzione che vogliamo mettere all'inizio).
Quindi abbiamo \2 \1
per mettere prima il secondo gruppo e poi uno spazio e poi il primo gruppo.
Verrà eseguito il backup del file originale come file.txt.bak
, se non lo desideri, usa solo -i
invece di -i.bak
.
**Sebbene si otterrà l'output desiderato, l'utilizzo di Regex/sed non sarà la soluzione ottimale in questo caso.
MODIFICA: Se hai una linea come [Internet disconnected] Friday, Mar 13,2015 15:48:34
, prova questo:
$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Nella regex precedente avevamo \(.*\),[[:blank:]]
(una virgola e uno spazio bianco dopo il primo gruppo corrispondente), ora per includere la nuova riga nell'output abbiamo creato il primo gruppo corrispondente \(.*[^,]\)
per assicurarci che non finisca con una virgola e quindi abbiamo abbinato ,*
cioè una o più virgole. Quindi, il nuovo sed
il comando funzionerà per tutti i casi menzionati.