com find
+ grep
:
find . -name '*.txt' -exec sh -c 'grep -HPo "frames=\K.*" "$0" | tail -n1' {} \;
E com o shell for
loop + grep
de maneira semelhante:
for file in *.txt; do grep -HPo 'frames=\K.*' "$file" | tail -n1; done
Eu tenho em um diretório /home/files/
alguns arquivos que todos têm a mesma extensão .txt
.
Por exemplo
1.txt
2.txt
3.txt
4.txt
5.txt
test.txt
Esses arquivos são todos iguais no formato de dados, mas os dados são diferentes. Todos esses arquivos têm pelo menos a seguinte linha dentro
frames=[number here]
Esta linha aparece várias vezes em um arquivo, então eu preciso obter o valor de frames=
que aparece por último no arquivo.
E como eu disse, eu quero obter essa linha, de todos os arquivos acima que correspondem à extensão .txt em um diretório (sem necessidade de recursiva).
Existe algum comando bash único para fazer isso?
Resultado esperado:
1.txt=5000
2.txt=123
3.txt=3452
4.txt=111
5.txt=958
test.txt=1231
Usando gawk
e desde que haja apenas um =
na linha, você pode fazer:
gawk -F= 'ENDFILE { print FILENAME"="$2 }' *.txt
Apenas percebi que eu interpretei mal essa questão, achei que a linha que você estava procurando fosse sempre a última linha. Para usar a última linha que começa com frames=
, para gawk
do:
gawk -F= '/^frames=/ { frames=$2 } ENDFILE { print FILENAME"="frames }' *.txt
Ou com qualquer awk
:
for file in *.txt; do
awk -F= '/^frames=/ { frames=$2 } END { print FILENAME"="frames }' "$file"
done
Você pode fazer isso com awk
awk -F= '/^frame/{line=FILENAME "=" $2}NR!=1 && FNR==1{print line}END{print line}' *.txt
Ou com sed
(versão GNU mais que 4.2.2)
sed -sn '/^frame/{s///;h};${F;x;p}' *.txt | sed 'N;s/\n//'
Com pax
(provavelmente também a maioria dos tar
) e tr
e GNU sed
:
pax -w ./*txt |
tr -s \0 |
sed -nz '/txt$/h
/\n*.*frames\(=[0-9]*\).*\n/!d
H;x;s///p'