less com opção -F e correspondência de padrões

less com opção -F e correspondência de padrões

A partir de um script, quero invocar lessum arquivo e fazer com que ele imprima a saída no console, em vez de uma nova tela. Se o arquivo for curto o suficiente para caber em uma tela, desejo desativar a rolagem. Se for maior que uma tela, quero poder rolar por ela, mas quando chegar ao fundo, quero lessdevolver o controle ao console. As linhas também devem ser cortadas (neste caso, não há problema em perder o final das strings além da janela do console).

Eu também gostaria que destacasse um determinado padrão.

Aqui está o que estou usando como argumentos:

less -SFXE -p "ccc" fileToShow.txt

Eu uso -Spara cortar linhas longas, -FXpara detectar se o arquivo tem menos linhas que o console e imprimir todo o texto no console sem rolar, e -Epara sair lessquando chegar ao final do arquivo, para os casos em que o texto é mais longo que o console e preciso rolar.

Eles funcionam bem até eu adicionar a -popção para destacar correspondências.

Suponha que fileToShow.txt contenha isto:

aaa
bbb
ccc
ddd
eee

Sem a opção de padrão, recebo o seguinte:

[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $ 

Quando adiciono a correspondência de padrões, less imprime as linhas vazias até a altura do console (usando tils para mostrar as linhas vazias).

[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $ 

Existe alguma maneira de usar o -pswitch e não mostrar essas linhas vazias ao usar -F? (Observação: a linha "ccc" está destacada conforme desejado, só tenho esse efeito colateral não intencional.)

Meu shell é bash 3.2.25e minha versão less é 436. O sistema operacional é RHEL.

Responder1

O seguinte comando pode ser encapsulado em um arquivo em lote:

 grep --color=always -E "^|$2" "$1"|less -SFXER

O parâmetro $1é o nome do arquivo e $2é o padrão de pesquisa. Pontos a serem observados:

  • grep -E(ou egrep) permite a correspondência com mais de um padrão de pesquisa;
  • combinar com ^(início da linha) garante que todas as linhas sejam listadas;
  • a correspondência $2faz com que a sequência de pesquisa seja destacada;
  • grep --color=alwayscopia as sequências de escape destacadas para o tubo;
  • less -Rfaz lessreproduzir o destaque em vez de mostrar a sequência de escape.

Não é a solução mais simples, mas algum tipo de resposta. Observe que o comando listará todas as linhas, destacando o padrão, enquanto less -pomite as linhas antes da primeira correspondência: para reproduzir isso você precisaria usar sed.

Responder2

Existe outra maneira, all in less. No entanto, envolve algumas etapas.

  1. less fileToShow.txt
  2. Hit &ccc(supondo que cccseja o padrão que você está procurando). Na página de manual:

    &pattern: Display only lines which match the pattern; lines which do not match the pattern are not displayed. If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed. While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden. Certain characters are special as in the / command: ^N or ! Display only lines which do NOT match the pattern. ^R Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

  3. Por fim, pressione Fpara continuar seguindo

Responder3

Não é inteiramente uma solução, mas algumas melhorias -p...
Elas dependem do +sinalizador flexível:

Se uma opção de linha de comando começar com +, o restante dessa opção será considerado um comando inicial paramenos. Por exemplo, +G diz menos para iniciar no final do arquivo, e não no início, e +/xyzinforma para iniciar na primeira ocorrência de "xyz" no arquivo. Como caso especial, +<number>atua como +<number>g; isto é, ele inicia a exibição no número de linha especificado (no entanto, consulte a advertência no comando "g" acima). Se a opção começar com ++, o comando inicial se aplica a todos os arquivos visualizados, não apenas ao primeiro. O + comando descrito anteriormente também pode ser usado para definir (ou alterar) um comando inicial para cada arquivo.

-ppula para a primeira correspondência (ou algumas linhas antes dela, se você usar --jump-target). Isso não é o que eu gostaria combinado com a saída quando curta - as linhas ignoradas não são nem mesmo o scrollback do terminal!

  1. Se você iniciasse lesse depois pesquisasse interativamente /ccc, less primeiro exibiria as linhas desde o início e só depois rolaria, para que elasseriatornar-se parte do buffer de rolagem do terminal. Podemos emular isso usando +, mas precisamos solicitar explicitamente uma nova pintura com r:

    env LESS= less -SFXE +r/ccc fileToShow.txt
    

    Isso ainda rola para a ccclinha, mas agora aaaestá bbbpelo menos no buffer de rolagem para trás. No entanto, se a pesquisa pular muitas linhas:

    seq 1000 | less -SFXE +r/980
    

    a rolagem mostrará algo como:

     48
     49
     50
     ...skipping...
     980
     981
     982
    

    Eu esperava que isso pudesse ser ajustado --max-back-scroll, mas não parece afetar a pesquisa. EDIT: parece depender do tamanho da janela, ou seja, preenche uma tela e depois pula.

  2. Quem disse que não quero ver as primeiras falas? Se eu quiser apenas destacar as correspondências, posso usar o truque da correspondência vazia:

     less -SFXE '+r/ccc|$' fileToShow.txt
    

    mas isso interrompe a navegação com n/ N. É melhor usar este sinalizador na /pesquisa:

    Certos caracteres são especiais se inseridos no início do padrão; eles modificam o tipo de pesquisa em vez de se tornarem parte do padrão:
    ...

    • ^K Realce qualquer texto que corresponda ao padrão na tela atual, mas não passe para a primeira correspondência (MANTENHA a posição atual).

    A sintaxe para incluir Ctrl+Kchar depende do shell, no bash isso funciona:

     less -SFXE $'+r/\cKccc' fileToShow.txt
    

    De qualquer forma, começar na primeira linha também reduz o número de ~preenchimentos da tela

informação relacionada