J'ai dans un directory /home/files/
certains files qui ont tous la même extension .txt
.
Par exemple
1.txt 2.txt 3.txt 4.txt 5.txt test.txt
Ces files sont tous identiques en format de données, mais datatables sont différentes. Tous ces files ont au less la ligne suivante à l'intérieur
frames=[number here]
Cette ligne apparaît plusieurs fois dans un file, donc j'ai besoin d'get la valeur de frames=
qui apparaît en dernier dans le file.
Et comme je l'ai dit je veux get cette ligne, de tous les files ci-dessus qui correspondent à l'extension .txt dans un directory (pas besoin de récursif).
Y at-il une seule command bash pour le faire?
Production attendue:
1.txt=5000 2.txt=123 3.txt=3452 4.txt=111 5.txt=958 test.txt=1231
Avec find
+ grep
:
find . -name '*.txt' -exec sh -c 'grep -HPo "frames=\K.*" "$0" | tail -n1' {} \;
Et avec shell for
boucle + grep
de la même façon:
for file in *.txt; do grep -HPo 'frames=\K.*' "$file" | tail -n1; done
En utilisant gawk
et à condition qu'il n'y en aura qu'un =
sur la ligne, vous pouvez faire:
gawk -F= 'ENDFILE { print FILENAME"="$2 }' *.txt
Je me suis rendu count que j'avais mal interprété cette question, je pensais que la ligne que vous searchz était toujours la dernière ligne. Pour utiliser la dernière ligne qui commence par frames=
, pour gawk
do:
gawk -F= '/^frames=/ { frames=$2 } ENDFILE { print FILENAME"="frames }' *.txt
Ou avec n'importe quel awk
:
for file in *.txt; do awk -F= '/^frames=/ { frames=$2 } END { print FILENAME"="frames }' "$file" done
Vous pouvez le faire avec awk
awk -F= '/^frame/{line=FILENAME "=" $2}NR!=1 && FNR==1{print line}END{print line}' *.txt
Ou avec sed
(version GNU plus que 4.2.2)
sed -sn '/^frame/{s///;h};${F;x;p}' *.txt | sed 'N;s/\n//'
Avec pax
(probablement aussi la plupart des tar
) et tr
et GNU sed
:
pax -w ./*txt | tr -s \\0 | sed -nz '/txt$/h /\n*.*frames\(=[0-9]*\).*\n/!d H;x;s//\1/p'