GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Spostare il modello all'inizio della linea?

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à a blah, 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.

Correlati:il sudo scade durante lo script di lunga durata?
Ubuntu
  1. Come spostare una riga in un file di testo su o giù di una riga?

  2. Trova il modello e spostati?

  3. Schema di sostituzione dopo l'ennesima corrispondenza trovata su ogni riga??

  4. Restituire solo la parte di una linea dopo uno schema corrispondente?

  5. Il concetto di 'Spazio di attesa' e 'Spazio del modello' in sed

Come spostare le directory in Linux

Come spostare le notifiche della shell di GNOME

Come eseguire la ricerca del modello nei file utilizzando Grep

Come spostare una directory in Linux

Lettori audio a riga di comando?

E commerciale all'inizio di una riga in csh