web-dev-qa-db-fra.com

Comment trouver un horodatage sur un fichier, puis l'insérer dans le contenu du fichier en tant que première ligne?

J'ai la commande suivante que j'essaye de modifier:

 stat -c %y test.txt | sed 's/^\([0-9\-]*\)/\1/'

Cela retourne les informations suivantes:

 2016-08-03 14:52:24.000000000

J'ai besoin de modifier cela pour qu'il exclue le ".000000000". J'ai essayé plusieurs options mais je n'arrive pas à comprendre. En fin de compte, je dois prendre l’horodatage que j’extrais de la commande ci-dessus et l’échanger en tant que première ligne du fichier.

J'ai comme exemple cette commande qui semble ajouter correctement une nouvelle ligne en haut du fichier:

   sed -i '1s/^/this should be a date\n/' test.txt

Comment combiner les deux commandes?

4
Happydevdays
sed -i "1i$(stat -c %y test.txt | sed -r 's/\.[0-9]+ / /')" test.txt
4
Florian Diesch

Ainsi:

( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt  ) > /tmp/temp_file && mv /tmp/temp_file test_file.txt

Voici une petite démo:

$> echo "Hello World" > test_file.txt
$> ( stat -c %y test_file.txt | awk -F '.' '{print $1}' ; cat test_file.txt  ) > /tmp/temp_file &&                       
> mv /tmp/temp_file test_file.txt
$> cat test_file.txt                                                                                                     
2016-08-03 09:24:27
Hello World

Explication:

  • Nous obtenons le contenu de l'horodatage et du fichier dans le sous-shell, indiqué par une parenthèse (...)
  • stat -c %y test_file.txt | awk -F '.' '{print $1}' horodatage des découpes
  • cat test_file.txt lit le contenu du fichier.
  • Le texte résultant est horodatage plus ce qui était dans le fichier, il est redirigé vers /tmp/temp_file
  • Enfin, nous remplaçons le fichier original par le contenu de /tmp/temp_file
5

Que diriez-vous d'utiliser ed au lieu de sed?

$ ed -s test.txt << EOF
0r !stat -c \%y %
1 s/\.[0-9]*//
w
q
EOF

Cela dit:

  • lisez le résultat de la commande stat -c \%y % et insérez-le à la position 0 dans le tampon, c'est-à-dire avant la première ligne. Notez que dans ed, un n échappé % est un raccourci pour le fichier en cours.
  • sur cette (maintenant la première) ligne, rien ne remplace la période décimale et les chiffres suivants
  • réécrit le résultat dans le fichier et quitte

Le -s est facultatif - il empêche simplement ed de générer des décomptes de lignes. Si stat ajoute un décalage de fuseau horaire dans vos paramètres régionaux et que vous souhaitez également le supprimer, vous pouvez modifier la commande s pour supprimer le point et tout ce qui le suit, par exemple. s/\..*//

Il est également possible d'utiliser ed dans une ligne, en prenant ses commandes depuis l'entrée standard à l'aide de echo ou printf, bien qu'il soit un peu difficile de réussir l'échappement:

printf '0r !stat -c \%%y %%\n1 s/\.[0-9]*//\nw\nq' | ed -s test.txt
4
steeldriver