Saída do pipe de um comando para dois outros [duplicados]

1

Eu preciso enviar a saída de um comando para dois outros comandos.

cat filename.txt | tail -n 1
cat filename.txt | wc -l

Como o arquivo é enorme, quero evitar lê-lo duas vezes. Eu verifiquei o comando tee , mas ele redireciona a saída para o arquivo que eu não quero. Há muitos posts relacionados, mas não encontraram nada relevante

    
por chhaya vishwakarma 23.07.2015 / 12:00

3 respostas

2

Se eu entendi corretamente, você deseja obter a última linha do arquivo junto com a contagem de linha:

$ cat a
aaa
bb
ccc
$
$ awk 'END{print $0; print NR}' a
ccc
3

Como você precisa salvar em variáveis:

$ out=$(awk 'END{print $0"|"NR}' a)
$ last_line=$(echo $out | awk -F"|" '{print $1}' )
$ tot_cnt=$(echo $out | awk -F"|" '{print $2}' )
$ echo $last_line
ccc
$ echo $tot_cnt
3
    
por 23.07.2015 / 12:04
1

Deixe o cat dormir, você não precisa dele.

Uso:

tail -n 1 filename.txt
wc -l filename.txt
    
por 23.07.2015 / 12:01
1
{   
    {   tee /dev/fd/3 | wc -l >&4
    }   3>&1 | tail -n1
}   <filename.txt 4>&1

Ele não evita lê-lo duas vezes - mas em sistemas multicore provavelmente será simultâneo. A ordem de saída não é garantida, no entanto.

Provavelmente, a maneira mais rápida de simular o que você está pedindo, no entanto, é:

dd bs=64k <filename.txt | tail -n1

dd reportará suas leituras / gravações para stderr e ainda copia todo o arquivo para stdout.

    
por 23.07.2015 / 12:03