
A partir de um script, quero invocar less
um 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 less
devolver 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 -S
para cortar linhas longas, -FX
para detectar se o arquivo tem menos linhas que o console e imprimir todo o texto no console sem rolar, e -E
para sair less
quando 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 -p
opçã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 -p
switch 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.25
e 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
(ouegrep
) 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
$2
faz com que a sequência de pesquisa seja destacada; grep --color=always
copia as sequências de escape destacadas para o tubo;less -R
fazless
reproduzir 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 -p
omite 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.
less fileToShow.txt
- Hit
&ccc
(supondo queccc
seja 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.
- 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+/xyz
informa 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.
-p
pula 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!
Se você iniciasse
less
e 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 comr
:env LESS= less -SFXE +r/ccc fileToShow.txt
Isso ainda rola para a
ccc
linha, mas agoraaaa
estábbb
pelo 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.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