Como usar `cat` ou` less` dependendo da contagem de linhas?

12

Ao analisar o conteúdo dos arquivos, gostaria de catencurtar automaticamente os arquivos, mas lessaqueles que excedem o tamanho da tela. Eu poderia usar algo com wc -l, mas existe uma maneira melhor que talvez também considere o tamanho da janela / quantidade atual de linhas disponíveis?

Tobias Kienzler
fonte
1
Enquanto muitas ferramentas fazem isso, observe que isso quebra a expectativa. Ou seja, o usuário não pode saber antecipadamente o que acontecerá. Acho isso irritante, por exemplo, no git logqual faz exatamente isso. Você nunca sabe de antemão o que vai receber (precisa acertar q?).
22612 bitmask
4
NOTA: Em geral, você deve evitar o uso catpara visualizar arquivos. Normalmente, você deve usar apenas catpara enviar o conteúdo de um arquivo para o stdout, para que ele possa ser canalizado para outro processo. O motivo para evitar o uso catpara visualização é que ele envia os bytes brutos para o terminal, o que pode causar a execução de comandos inesperados do terminal (por exemplo, alguns usuários ficam presos quando um arquivo contém os bytes corretos para desativar o teclado do terminal) . Você geralmente deve usar um pager como lessou um editor, que formatará caracteres especiais para exibição, para que não sejam interpretados pelo terminal.
Chris Page
2
Se você usar o cat para visualizar o conteúdo do arquivo diretamente no terminal, use pelo menos cat -vpara que ele escape de caracteres especiais.
Chris Page
@bitmask bom ponto, é por isso que perguntei É catpossível usar a tela dividida ? o que pode ser uma solução melhor
Tobias KIENZLER
@ChrisPage Meu teclado não foi morto, mas eu acho que eu consegui estragar a página de códigos, uma vez ... Obrigado por apontar cat -vpara fora
Tobias KIENZLER

Respostas:

9

Para fornecer a fórmula que envolve a wcverificação baseada em:

(($(wc -l<input_file)<=$(tput lines))) && echo 'will fit' || echo 'not enough'

Há uma $LINESvariável de shell que também pode ser usada:

(($(wc -l<input_file)<=LINES)) && echo 'will fit' || echo 'not enough'

Mas $LINESé atualizado apenas quando no prompt de comando. Para entender o que quero dizer, execute isso e redimensione a janela do terminal durante o sleep:

( sleep 3; echo $LINES; tput lines )
homem a trabalhar
fonte
Obrigado, isso tem a vantagem de poder ser ajustado para uso lessjá se, por exemplo, 2/3 da tela foram usados cat.
Tobias Kienzler
20

Talvez 'less -F file_to_read' seja a opção: ela sai menos se a janela for suficiente para exibir todo o arquivo e aguarde no pager, se não for o caso

Dom
fonte
sons bom, mas que não exibe nenhum output nesse caso, e os códigos de saída é a mesma em ambos os casos
Tobias KIENZLER
Eu apenas tento 'less -F / etc / passwd' e ele exibe o arquivo corretamente (com ou sem pager). Você está certo, o código de retorno é 0 nos dois casos.
Dom
11
Esse comando funciona conforme solicitado, mas com uma pequena falha: limpa a tela após a exibição do arquivo. A adição da -Xopção interromperá a limpeza, para que arquivos curtos sejam exibidos como o catfazem. Infelizmente, -Xa tela não será limpa nem após a exibição de arquivos longos e rolados.
manatwork
1
@ manatwork isso é ótimo, obrigado. Não limpar a tela é realmente ok, já que é o que (não) acontecer se catforam chamados assim
Tobias KIENZLER