Linux / Comando more: ler por telas, pesquisar e iniciar em uma linha

O comando more é um paginador: divide a leitura de um texto em telas e espera comandos de navegação no terminal. Espaço avança uma tela, Enter avança uma linha e q encerra a leitura. Para buscas e deslocamentos frequentes nos dois sentidos, less costuma oferecer mais recursos.

As opções descritas seguem o more do pacote util-linux, comum em distribuições Linux, conforme seu manual e a fonte oficial atual do manual. As práticas também usam Bash e utilitários GNU como mktemp, seq e cat. Elas criam arquivos pequenos em uma pasta exclusiva sob a pasta atual, sem ler logs de produção.

O paginador aceita arquivos e entrada padrão, como a saída de outro comando. O comportamento depende de a saída estar ligada a um terminal interativo, da implementação e das configurações locais. No util-linux, b permite voltar uma tela ao ler arquivos passados por nome, mas não funciona em pipes. Outras versões de more, inclusive as de outros sistemas operacionais, podem aceitar opções diferentes.

Sintaxe básica

more [opções]... [arquivo]...

opções e arquivo são marcadores. Confira more --version, more --help e man more no Linux de destino. Use aspas em caminhos com espaços e -- antes dos nomes para impedir que pareçam opções. Execute a preparação no mesmo terminal e pare se houver erro; não aplique esses argumentos automaticamente ao comando de mesmo nome de outro sistema.

Uso básico do more

Preparar um arquivo e ler por telas

A preparação cria um log de 240 linhas numeradas no próprio texto, com ERROR nas linhas 60 e 200, e cópias para as práticas de navegação. Também cria um relatório com linhas vazias, um arquivo com uma linha larga e um arquivo de controle. A última chamada abre o log com até 12 linhas por página, usando a forma -12. O tamanho da janela e a largura das linhas também afetam o que cabe visualmente. As linhas numeradas ajudam a conferir de onde a leitura continua.

more_start=$PWD
more_demo=$(mktemp -d -p "$PWD" 'more-demo.XXXXXXXX') &&
cd -- "$more_demo" &&
for i in $(seq 1 240); do
  case "$i" in
    60|200) printf 'linha %03d: ERROR de demonstracao\n' "$i" ;;
    *) printf 'linha %03d: INFO de demonstracao\n' "$i" ;;
  esac
done > server.log &&
cat -- server.log > README.txt &&
cat -- server.log > changelog.txt &&
cat -- server.log > sample.txt &&
printf 'inicio\n\n\nmeio\n\n\n\nfim\n' > report.txt &&
{
  printf 'linha curta\ninicio|'
  printf 'coluna-%02d|' $(seq 1 30)
  printf 'FIM\nultima linha\n'
} > wide.txt &&
printf 'controle intacto\n' > sentinel.txt &&
more -12 -- README.txt

Avançar, pedir ajuda e sair

Abra a cópia abaixo. Na pausa, pressione Espaço para continuar uma página, Enter para avançar uma linha e q para voltar ao shell. No util-linux, h ou ? mostra a ajuda; = informa o número da linha atual. A opção -d acrescenta orientações ao prompt e troca alguns avisos sonoros por mensagens. As teclas são digitadas dentro do paginador, não como novos comandos no shell.

cd -- "$more_demo" &&
more -d -12 -- changelog.txt

Paginar a saída de outro comando

O pipe | liga a saída do produtor à entrada de more. O exemplo gera uma sequência finita de 1 a 120; avance com Espaço e saia com q. Em um Linux que permita ler o buffer de mensagens do kernel, dmesg | more é outro uso possível. O manual de dmesg explica que a leitura pode ser negada pelas restrições do sistema. Se o produtor falhar, abrir o paginador não recupera os dados nem comprova que a leitura funcionou.

seq 1 120 | more -12

Entender a pausa e o fim da entrada

Ao abrir sample.txt, o paginador mostra uma página e pode apresentar um indicador de pausa antes de continuar. A indicação --More-- não significa que o arquivo terminou. O bloco de status abaixo é apenas uma ilustração de formato: não é um comando nem o resultado esperado desta prática, e o valor de 50% não corresponde a um número fixo de linhas.

cd -- "$more_demo" &&
more -12 -- sample.txt

Exemplo ilustrativo de um indicador de pausa:

--More--(50%)

O indicador pode variar com idioma, implementação e tipo de entrada; em pipes, um percentual pode não estar disponível. Ao chegar ao fim, more pode sair automaticamente. No util-linux atual, o encerramento no fim é normalmente habilitado, com condições diferentes quando POSIXLY_CORRECT está definido ou a saída não é um terminal. Se a saída for redirecionada para outro pipe ou arquivo, pode não haver navegação interativa. Não use a presença ou ausência do prompt como prova de erro.

Principais opções

Opção Efeito no util-linux more
-d Exibir instruções de teclas e algumas mensagens de erro em vez de avisos sonoros; não ocultar o texto do arquivo.
-s Reduzir várias linhas realmente vazias consecutivas a uma na exibição; não editar o arquivo nem remover linhas contendo espaços.
-f Contar linhas lógicas, delimitadas por quebras de linha, em vez de linhas de tela. Uma linha longa conta como uma linha lógica, mesmo que ocupe mais espaço visual.
-NUM Definir o número de linhas por página, como -12. O util-linux atual também aceita --lines NUM.
+NUM Iniciar a leitura na linha indicada de cada arquivo.
+/PADRÃO Procurar o padrão antes de começar a exibição, mostrando a região da primeira correspondência.

Exemplos práticos

Começar na linha 200

O arquivo preparado tem 240 linhas, portanto a linha 200 existe e contém linha 200: ERROR de demonstracao. O argumento +200 pede que a leitura comece nessa posição; a opção -12 mantém páginas pequenas para a comparação. Isso usa o número da linha, não um horário nem uma busca por 200 dentro do texto. Confira o comportamento da implementação se o número ultrapassar o fim da entrada.

cd -- "$more_demo" &&
more -12 +200 -- server.log

Começar na região de uma correspondência

A primeira ocorrência de ERROR está na linha 60. O argumento inteiro +/ERROR fica entre aspas, protegendo o padrão do shell; more pode mostrar linhas de contexto anteriores à correspondência. Dentro do util-linux more, /ERROR seguido de Enter procura o padrão e n repete a pesquisa; neste log, há outra ocorrência na linha 200. Os padrões são expressões regulares, e caracteres como . ou * podem ter outro significado. A tecla ? abre ajuda no util-linux more; não a trate como a busca para trás de less.

cd -- "$more_demo" &&
more -12 '+/ERROR' -- server.log

Reduzir espaços vazios sem alterar os dados

O relatório contém inicio, duas linhas vazias, meio, três linhas vazias e fim. Com -s, cada grupo de linhas vazias consecutivas é mostrado como uma linha: o resultado conceitual tem cinco linhas. Uma linha com espaços não é vazia. O arquivo original continua com oito linhas. Como o exemplo é curto, o paginador pode encerrar logo se a saída couber na tela; isso não significa que a opção falhou. Para observar a contagem de linhas largas, compare more -3 -- wide.txt com more -3 -f -- wide.txt: a opção -f muda a contagem lógica, sem cortar dados do arquivo.

cd -- "$more_demo" &&
more -s -12 -- report.txt

Comparar more e outros comandos

Comando Função principal Quando usar
more Paginar, principalmente para leitura adiante Navegação simples no terminal
less Navegar e pesquisar com mais recursos Explorar arquivos longos nos dois sentidos
cat Enviar o conteúdo à saída sem paginação própria Exibir textos curtos ou concatenar dados
head Selecionar a parte inicial Conferir poucas linhas ou um cabeçalho

Cuidados importantes

Conferir a implementação e as opções locais

util-linux, versões BSD e outros sistemas não oferecem necessariamente os mesmos atalhos, nomes longos ou regras de saída. A variável de ambiente MORE também pode fornecer opções ao util-linux more. Use a ajuda e o manual da instalação; não confunda o comando Linux com uma ferramenta homônima do Windows. A navegação comum não altera a entrada, mas abrir um editor por um atalho tem outro efeito e não faz parte destas práticas. Depois de sair, volte à pasta anterior com cd -- "$more_start".

Distinguir arquivo e pipe para voltar na leitura

Um arquivo passado por nome pode ser relido; um pipe é uma sequência recebida de outro processo. No util-linux more, b para voltar uma página funciona com arquivos e não com pipes. Por isso, more -- server.log e cat -- server.log | more não são equivalentes para navegação, mesmo que os bytes recebidos sejam os mesmos. Para explorar o histórico de uma saída nos dois sentidos, considere less, respeitando o consumo de memória e o tipo de entrada.

Escolher saída não interativa para automações

Um paginador que espera teclado pode bloquear uma tarefa sem operador. Para obter apenas as primeiras 20 linhas, use head -n 20 -- arquivo; para uma região por número de linha, uma forma é sed -n '200,220p' arquivo. Esses exemplos selecionam dados sem exigir Espaço ou q. Confira os estados de saída e as mensagens do comando que produz os dados; o estado de um pipeline no Bash depende de sua configuração. O cat pode apenas enviar um arquivo curto à saída quando nenhuma seleção ou paginação é necessária.

Perguntas frequentes

Como sair do more?

Na pausa interativa, pressione q. O programa também pode encerrar ao atingir o fim da entrada, dependendo da implementação e da configuração. No shell, q não é um comando de controle do paginador anterior.

Como avançar uma linha por vez?

Pressione Enter na pausa interativa. No util-linux more, esse comando normalmente avança uma linha; números digitados antes de certos comandos podem mudar quantas linhas são exibidas. Espaço avança uma página.

Quando escolher more ou less?

more serve para paginação simples. less costuma ser mais conveniente para buscas e exploração nos dois sentidos. No util-linux more, a volta com b é limitada a arquivos, e não funciona em pipes; confira as diferenças da implementação instalada.

Como começar em uma linha específica?

No util-linux more, use uma forma como more +200 -- arquivo.log. O número se refere à linha do arquivo. Para procurar conteúdo, use o argumento +/PADRÃO com aspas adequadas; é uma operação diferente de saltar por número.