J'essaie de reformater un fichier journal de sorte que la date et l'heure apparaissent au début de la ligne. Mes journaux ressemblent à ceci :
blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
Je voudrais qu'ils ressemblent à ceci :
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Je suis allé jusqu'à trouver le bon modèle grep avec 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
.
Comment puis-je déplacer ces résultats de modèle à gauche de la chaîne d'informations ? Merci pour votre aide.
Réponse acceptée :
Essayez sed
avec la regex suivante :
$ 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
Ici, nous avons utilisé le sed
méthode de substitution de groupe pour obtenir la sortie souhaitée.
\(.*\)
correspondra jusqu'àblah, blah, blah
comme nous avons,[[:blank:]]
pour correspondre à,
après.\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)
correspondra à la partie restante de la ligne (la partie que nous voulons mettre au début).
Alors nous avons \2 \1
pour mettre le deuxième groupe en premier, puis un espace et enfin le premier groupe.
Le fichier d'origine sera sauvegardé en tant que file.txt.bak
, si vous ne le souhaitez pas, utilisez simplement -i
au lieu de -i.bak
.
**Bien que vous obteniez la sortie souhaitée, l'utilisation de Regex/sed ne sera pas la solution optimale dans ce cas.
MODIF : Si vous avez une ligne comme [Internet disconnected] Friday, Mar 13,2015 15:48:34
, essayez ceci :
$ 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
Dans l'expression régulière précédente, nous avions \(.*\),[[:blank:]]
(une virgule et un espace après le premier groupe correspondant), maintenant pour inclure la nouvelle ligne dans la sortie, nous avons créé le premier groupe correspondant \(.*[^,]\)
pour s'assurer qu'il ne se termine pas par une virgule, puis nous avons trouvé ,*
c'est-à-dire une ou plusieurs virgules. Ainsi, le nouveau sed
La commande fonctionnera pour tous les cas mentionnés.