GNU/Linux >> Znalost Linux >  >> Ubuntu

Přesunout vzor na začátek řádku?

Snažím se přeformátovat soubor protokolu tak, aby se datum a čas objevily na začátku řádku. Moje protokoly vypadají takto:

blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11

Chtěl bych, aby vypadaly takto:

Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada

Zašel jsem tak daleko, že jsem našel správný vzor grep s 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 .

Jak mohu přesunout tyto výsledky vzorů nalevo od informačního řetězce? Děkujeme za vaši pomoc.

Přijatá odpověď:

Zkuste sed s následujícím regulárním výrazem:

$ 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

Zde jsme použili sed 's metodou substituce skupiny k získání požadovaného výstupu.

  • \(.*\) bude odpovídat až blah, blah, blah jako máme ,[[:blank:]] aby odpovídaly , po něm.
  • \([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\) bude odpovídat zbývající části řádku (části, kterou chceme umístit na začátek).

Pak máme \2 \1 vložte nejprve druhou skupinu a poté mezeru a poté první skupinu.

Původní soubor bude zálohován jako file.txt.bak , pokud to nechcete, použijte pouze -i místo -i.bak .

**Přestože získáte požadovaný výstup, použití Regex/sed nebude v tomto případě optimálním řešením.

UPRAVIT: Pokud máte řádek jako [Internet disconnected] Friday, Mar 13,2015 15:48:34 , zkuste toto:

$ 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

V předchozím regulárním výrazu jsme měli \(.*\),[[:blank:]] (čárka a mezera za první odpovídající skupinou), nyní pro zahrnutí nového řádku do výstupu jsme vytvořili první odpovídající skupinu \(.*[^,]\) abychom zajistili, že nebude končit čárkou, a poté jsme přiřadili ,* tj. jedna nebo více čárek. Takže nový sed příkaz bude fungovat ve všech uvedených případech.

Související:Časový limit sudo během dlouhého běhu skriptu vypršel?
Ubuntu
  1. Pomocí Sed k vyhledání a nahrazení čáry mezi rozsahy vzorů

  2. Jak vložit text na začátek každého řádku ve Vimu

  3. Vytisknout předchozí řádek po shodě vzoru pomocí Sed?

  1. Najít vzor a přesunout?

  2. Nahrazení vzoru po N-té shodě se najde na každém řádku?

  3. Vrátit pouze část řádku po odpovídajícím vzoru?

  1. Přidejte předponu na začátek každého řádku

  2. Koncept 'Hold space' a 'Pattern space' v sed

  3. Jak mohu přidat řetězec na začátek každého řádku v souboru?