web-dev-qa-db-fra.com

sed pour exécuter une commande en remplacement du motif de substitution en argument

J'essaie de remplacer l'heure dans un fichier journal par:

cat mlog.log | sed -e "s/^[0-9\.]*/\$(date -d @&)/"

Pourquoi toujours exécuter d'abord $(date -d $&) mais ne pas remplacer au début puis exécuter la commande?

Je pensais que ce serait comme:

date -d @121223232

Le journal ressemble à ceci:

1428688532.169   peerdiff 2
1428688534.269   peerdiff 1 
2
user2700517

Si mlog.log est séparé par des espaces:

cat mlog.log |Perl -a  -ne  'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join(" ",@F)."\n"'

Si mlog.log est séparé par des tabulations:

cat mlog.log |Perl -a -F"\t" -ne  'chomp($F[0]=`date -d \@$F[0] +%FT%T`); print join("\t",@F)."\n"'
1
Ole Tange

La raison pour laquelle cela fonctionne comme ceci est la façon dont fonctionne le Shell. Tout d'abord, il commence à interpréter tout ce qu'il peut. C'est à dire. Essayez de comparer echo "$(date)" avec echo '$(date)'. Si vous voulez faire ce que vous voulez, vous devez utiliser une autre approche, par exemple :

awk '{ system("echo `date -d @"$1"` "$2" "$3);}' < mlog.log

C'est à dire. Faites en sorte que awk scinde le fichier en colonnes et exécute la commande système que vous alimentez avec des colonnes selon vos besoins. Vous ne pouvez pas utiliser sed de la même manière car la commande sed s ne permet pas d’appeler la commande Shell.

0
ludvik02