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
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"'
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.