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?
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.
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
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
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
.
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).
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
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
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