Obtém a primeira linha da saída de um comando shell

97

Ao tentar ler o número da versão de vim, recebo muitas linhas adicionais que preciso ignorar. Tentei ler o manual do heade tentei o seguinte comando:

vim --version | head -n 1

Eu quero saber se esta é a abordagem correta?

john doe
fonte
4
Como isso falhou? Funciona para mim.
choroba,
1
A sintaxe está correta. Qual é o erro ..?
Kaushik Nayak
2
Isso funciona para mim, mas talvez você esteja usando uma versão do vim que grava informações de versão em stderr. Testevim --version 2>&1 | sed 1q
William Pursell,
Funciona para mim também - então sim, sua abordagem está correta :)Verifique se o seu pacote gera essa informação, stderrpois @WilliamPursell fornece uma verificação para
David C. Rankin,

Respostas:

139

Sim, essa é uma maneira de obter a primeira linha de saída de um comando.

Se o comando resultar em qualquer erro padrão que você gostaria de capturar da mesma maneira, você precisará redirecionar o erro padrão do comando para o fluxo de saída padrão:

utility 2>&1 | head -n 1

Existem muitas outras maneiras de capturar a primeira linha também, incluindo sed 1q(sair após a primeira linha), sed -n 1p(imprimir apenas a primeira linha, mas ler tudo), awk 'FNR == 1'(imprimir apenas a primeira linha, mas, novamente, ler tudo) etc.

Kusalananda
fonte
4

Eu usaria:

awk 'FNR <= 1' file_*.txt

Como @Kusalananda aponta, há muitas maneiras de capturar a primeira linha na linha de comando, mas usar o head -n 1pode não ser a melhor opção ao usar curingas, já que imprimirá informações adicionais. Mudar 'FNR == i'para 'FNR <= i'permite obter as primeiras i linhas.

Por exemplo, se você tiver n arquivos chamados file_1.txt, ... file_n.txt:

awk 'FNR <= 1' file_*.txt

hello
...
bye

Mas com headcuringas imprima o nome do arquivo:

head -1 file_*.txt

==> file_1.csv <==
hello
...
==> file_n.csv <==
bye
alemol
fonte
2
Verhead -qn1 file_*.txt
F. Hauri