web-dev-qa-db-fra.com

Comment dériver la date et l'heure actuelles et les ajouter à la fin de chaque ligne contenant «Bonjour»

J'ai le fichier suivant party.txt qui contient quelque chose comme ceci:

Hello Jacky
Hello Peter
Bye Johnson
Hello Willy
Bye Johnny
Hello Mary
Hello Wendy

J'ai utilisé le grep hello pour capturer le contenu, mais lorsque j'utilise le print date +"%Y-%m-%d' et y ajouter, je ne peux pas, et j'obtiendrai beaucoup 0 par ligne.

cat party.txt | grep Hello | awk '{ print date +"%Y-%m-%d"}'

Que pourrais-je manquer?

19
Jack

Une façon d'utiliser awk:

awk -v date="$(date +"%Y-%m-%d %r")" '/Hello/ { print $0, date}' party.txt

Résultats:

Hello Jacky 2012-09-11 07:55:51 PM
Hello Peter 2012-09-11 07:55:51 PM
Hello Willy 2012-09-11 07:55:51 PM
Hello Mary 2012-09-11 07:55:51 PM
Hello Wendy 2012-09-11 07:55:51 PM

Notez que la valeur de date n'est définie que lorsque awk démarre, elle ne changera donc pas, même si l'exécution de la commande prend beaucoup de temps.

28
Steve

gawk (et les versions récentes de mawk) ont intégré fonction heure/date , il n'est donc pas nécessaire d'utiliser des outils externes.

gawk '/Hello/{print NR " - " $0 " - " strftime("%Y-%m-%d")}' party.txt
38
Alin
 awk 'BEGIN{"date +'%Y-%m-%d'"|getline d;}/Hello/{print $0,d}' file

te donnera:

Hello Jacky  2012-09-11
Hello Peter 2012-09-11
Hello Willy 2012-09-11
Hello Mary 2012-09-11
Hello Wendy 2012-09-11
3
Kent

Cette solution devrait fonctionner avec n'importe quel awk:

awk '/Hello/ {cmd="(date +'%H:%M:%S')"; cmd | getline d; print d,$0; close(cmd)}' party.txt

La magie opère dans l'instruction close(cmd). Il force awk à exécuter cmd à chaque fois, donc, la date serait réelle à chaque fois.

cmd | get line d Lit la sortie de cmd et l'enregistre dans d.

3
Jimilian

Pour répondre à la question directe, ce qui vous manque, c'est que date est une commande externe, et vous devez donc soit l'invoquer en dehors de awk et le passer en tant que variable (comme le montre l'une des autres réponses ), ou l'invoquer depuis awk en tant que commande système en utilisant la fonction intégrée system() ou un canal (comme le montre une autre des autres réponses).

La raison pour laquelle vous voyez 0 est parce que l'expression date +"%Y-%m-%d" est interprété comme ajoutant la valeur numérique de la variable date (qui sera 0 tel qu'il n'est pas défini) à la valeur numérique de la chaîne "%Y-%m-%d" (qui sera 0 car ce n'est pas un nombre valide).

2
danfuzz

En gawk uniquement:

$ gawk '/Hello/ {print $0, strftime("%Y-%m-%d");}' party.txt 
Hello Jacky 2019-09-17 
Hello Peter 2019-09-17 
Hello Willy 2019-09-17 
Hello Mary 2019-09-17 
Hello Wendy 2019-09-17 
0
dr-who

en utilisant posix sed (et un sous-shell en raison de la fonction temporelle manquante dans sed)

sed -n "/^Hello/ s/$/ $( date +'%Y-%m-%d' )/p" party.txt

revenir

Hello Jacky 2016-11-10
Hello Peter 2016-11-10
Hello Willy 2016-11-10
Hello Mary 2016-11-10
Hello Wendy 2016-11-10
0
NeronLeVelu

Si vous êtes prêt à utiliser Perl:

Perl -MPOSIX -lne 'if (/Hello/){ print "$_ " . strftime "%Y-%m-%d",localtime }' party.txt

produit cette sortie

Hello Jacky 2015-10-01
Hello Peter 2015-10-01
Hello Willy 2015-10-01
Hello Mary 2015-10-01
Hello Wendy 2015-10-01

Voici comment ça fonctionne:

  • -n boucle autour de chaque ligne du fichier d'entrée, n'imprime pas automatiquement chaque ligne

  • -l supprime les sauts de ligne avant le traitement et les réintègre ensuite

  • -e exécute le code Perl

  • $_ est la ligne courante

  • -MPOSIX charge le module POSIX, qui inclut strftime

  • localtime et strftime imprime l'heure, compte tenu du format %Y-%m-%d

0
Chris Koknat