A maneira mais rápida de ler a última linha dentro do padrão de vários arquivos com a mesma extensão

3

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?

EDITAR

Resultado esperado:

1.txt=5000
2.txt=123
3.txt=3452
4.txt=111
5.txt=958
test.txt=1231
    
por OhGodWhy 11.01.2015 / 12:02

4 respostas

2

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
    
por 11.01.2015 / 12:33
2

Usando gawk e desde que haja apenas um = na linha, você pode fazer:

gawk -F= 'ENDFILE { print FILENAME"="$2 }' *.txt

Atualizar

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
    
por 11.01.2015 / 12:15
2

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//'
    
por 11.01.2015 / 12:34
1

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'
    
por 11.01.2015 / 12:30