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.