Faire écho au texte avant chaque ligne après grep et couper sur Unix

J’essaie de rendre la sortie d’un travail de plusieurs fichiers journaux plus conviviale sur Unix.

Les fichiers journaux vont de Web.log, le plus récent à Web.log.30 étant le plus ancien. Je suis en train de taper job123 à partir de ces fichiers, puis de passer à un nouveau grep où il ne prend que les lignes avec le message Exit, ce qui signifie que le travail est terminé. Ensuite, je le coupe sur la virgule, de sorte que je n’imprime que les horodatages au lieu de la ligne entière. Voici mon script:

for file in `ls -tr Web.log*`; do grep job123 $file | grep Exit | cut -d "," -f1; done 

Lequel me donne les horodatages que je veux, dans un ordre chronologique:

 2015-06-17 21:07:00 2015-06-17 22:07:00 2015-06-17 23:07:00 2015-06-18 00:07:00 2015-06-18 01:07:00 2015-06-18 02:07:00 2015-06-18 03:07:00 

Tout ce que je veux faire, c’est append un écho au début de chaque ligne en disant: “Le script job123 a fonctionné à:” il ressemblerait à ceci:

 Script job123 ran at: 2015-06-17 21:07:00 Script job123 ran at: 2015-06-17 22:07:00 Script job123 ran at: 2015-06-17 23:07:00 Script job123 ran at: 2015-06-18 00:07:00 Script job123 ran at: 2015-06-18 01:07:00 Script job123 ran at: 2015-06-18 02:07:00 Script job123 ran at: 2015-06-18 03:07:00 

Comme l’utilisateur connaît à peine Unix, je dois juste le rendre aussi convivial que possible à lire. Je suis aux sockets avec la partie qui fait écho.

Aussi, chacun des fichiers journaux a environ 25 Mo de long, de sorte que la série de canaux peut consumr beaucoup de mémoire, donc si quelqu’un a des suggestions pour accélérer les choses, c’est très apprécié.

Notez que cela se trouve sur un serveur de production, l’installation d’autres scripts comme multigrep est donc hors de question. Je vais le faire en tant que script sur une seule ligne pour rendre l’utilisation plus simple pour l’utilisateur.

Comment puis-je faire écho à ce texte sur le script que j’utilise actuellement? J’ai déjà essayé de faire écho en plusieurs étapes mais sans succès.

Je vous remercie.

Réutiliser votre code, cela peut être réalisé en remplaçant la commande cut ( cut -d "," -f1 ) par awk -F, '{print "Script job123 ran at: " $1}'

Sinon, la même chose peut être réalisée avec awk seul:

 for file in `ls -tr Web.log*`; do awk -F, '/job123/&&/Exit/{print "Script job123 ran at: " $1}' $file; done 

Stockez la sortie de votre commande dans une variable et imprimez avec du texte supplémentaire:

 for file in `ls -tr Web.log*`; do out=$(grep job123 $file | grep Exit | cut -d "," -f1;) echo "Script job123 ran at: ${out}" done 

Vous pouvez également combiner les deux grep en un seul:

 out=$(grep -E 'job123.*Exit|Exit.*job123' $file) 

Si vous pouvez utiliser awk cela pourrait simplifier en une seule commande:

 out=$(awk -F, '/job123/&&/Exit/{print $1}' $file) 

Puisque vous devrez parsingr chaque ligne, la solution awk (sans les tuyaux) va être meilleure. Mais je ne peux pas dire combien vous accélérez vous obtiendrez.