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, blahcome 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.