Pipe grep para less mostrando o comando grep como nome do arquivo

1

less -M mostrará o nome do arquivo como um prompt, como em:

      1 asdf
test.txt lines 1-1/1 (END)

Eu gosto de canalizar grep em menos para facilitar a leitura. Posso obter menos para interpretar o comando grep como nome de arquivo para o seu prompt?

Normalmente é apenas:

grep asdf test.txt | less :

      1 asdf
lines 1-1/1 (END)

Eu gostaria de:

grep asdf test.txt | less :

      1 asdf
grep asdf test.txt lines 1-1/1 (END)

Sei que posso incluir tudo isso em um script e fazer as coisas com os argumentos $0 , mas não tentando reinventar a roda aqui.

Isso é possível com apenas alguns truques de linha de comando?

    
por Mike Dannyboy 12.12.2017 / 20:04

2 respostas

1

less não tem a menor idéia do que está no outro lado do canal que está alimentando dados para ele via entrada padrão, a menos que alguém complique muito o código para less para encontrar o grupo de processos que less está em execução e outros processos nesse grupo de processos e, em seguida, quem sabe como todos eles se encaixam (o shell conhece essas informações, mas pode não disponibilizá-las).

De algumas leituras em less(1) , pode-se encontrar a opção -P para personalizar o prompt

$ echo hi | less -P '?f%f:Standard input'
hi
Standard input

então, em teoria, se pudermos substituir o Standard input bit pelo pipeline atual do shell ... vamos ver o que é set quando less é executado ...

$ function less { set > whatisset; command less "$@"; }
$ echo foo | less
foo
$ egrep 'echo|foo' whatisset
$ 

então nada é óbvio para usar em mksh , já que echo ou foo (equivalente ao seu grep ) não aparecem em nenhum lugar no ambiente shell (mesma história para zsh e oh wow faz bash no Linux já spam o ambiente com configurações, mas novamente a mesma história). Na verdade, com zsh , podemos usar uma função preexec para disponibilizar a linha de comando:

$ zsh
% function preexec { shift; SHORT=$1; }
% function less { set > whatisset; command less "$@"; }
% echo foo | less
foo
% grep SHORT whatisset
SHORT='echo foo | less'
% 

para que alguém possa fazer algo como

% less() { =less -P '?f%f:'${SHORT%% | less} "$@"; }
% echo hi|less
hi
echo hi
    
por 12.12.2017 / 21:31
0

Eu fui contra mim mesmo e escrevi um pequeno roteiro que faz isso. Não é bonito, mas funciona, e não é ruim, pois são apenas algumas linhas. Sempre pronto para melhorias.

#!/bin/bash

# store all args as string
allargs="$*"

# create temp file named as grep command
TMPFILE=$(mktemp -q "$allargs")

# run grep command
$* --color=always > "$TMPFILE" # --color=always with less -r will highlight results in less

# show results file in less
less -Mr "$TMPFILE"

# delete the temp file
rm -f -- "$TMPFILE"

Executar como ./scriptname grep <opts> <regex> <file(s)> .

Desvantagem: se file for * (pesquisar todos no diretório atual), eles serão expandidos e feitos como parte do nome do arquivo, o que anulará o propósito, pois empurra o comando para fora da tela (nome de arquivo muito longo) . A menos que haja uma maneira de rolar o nome do arquivo horizontalmente em less ?

    
por 13.12.2017 / 03:03