GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Déplacer le motif au début de la ligne ?

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.

Connexe :Sudo expire pendant un long script en cours d'exécution ?
Ubuntu
  1. Utilisation de Sed pour rechercher et remplacer une ligne entre des plages de motifs

  2. Comment insérer du texte au début de chaque ligne dans Vim

  3. Comment déplacer une ligne vers le haut ou vers le bas d'une ligne dans un fichier texte ?

  4. Trouver un modèle et déplacer ?

  5. Remplacer le motif une fois que la nième correspondance est trouvée sur chaque ligne ? ?

Comment déplacer des répertoires sous Linux

Comment déplacer les notifications du shell GNOME

Comment effectuer une recherche de modèle dans les fichiers à l'aide de Grep

Comment déplacer un répertoire sous Linux

Trouver non récursif lorsqu'on lui donne un modèle sur la ligne de commande ?

Lecteurs audio en ligne de commande ?