Como fazer a saída do grep ajustar a largura da tela dos caracteres

1

Freqüentemente, acabo usando arquivos com linhas muito longas, resultando em páginas com valor de saída para uma palavra correspondente.

Qual é uma boa maneira de limitar a saída a apenas caracteres suficientes como a largura do meu terminal?

Sei que isso significa que a palavra correspondente pode não estar presente na linha. Mas eu ainda quero contexto, então somente nome de arquivo não é aceitável.

    
por masukomi 11.02.2018 / 03:08

2 respostas

2

Considere esta função de quebra automática, que transmite quaisquer parâmetros para o grep, em seguida, corta a saída para $ COLUMNS (ou 80, se COLUMNS não estiver definida):

function grepcut() {
  grep "$@" | cut -c1-${COLUMNS:-80}
}

Use como:

$ grepcut sometext somefiles

ou

$ set | grepcut LS_COLORS
    
por 11.02.2018 / 03:44
0

Aqui está uma abordagem mais complicada que dá saída que você pode preferir. Funciona melhor se você costuma procurar por strings simples (sem caracteres especiais regex) e não use nenhuma opção (ou, pelo menos, use a (s) mesma (s) opção (s) a cada hora). Meu script greptrim :

#!/bin/bash
case "$1" in
    ("")
        echo "Usage: $0 string [files...]"
        exit 2
        ;;
    (-*)
        echo "This script can't take options."
        exit 2
        ;;
esac
read rows cols <<< $(stty size)
if [ "$cols" = "" ]
then
        cols=80
fi
margin=$(( (cols-${#1}) / 2 ))
grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}"
  • Preliminares: verifique se existe um argumento string (padrão) não nulo e que não é uma opção.
  • Então, usamos outra maneira de obter o número de colunas. 1
  • Da largura da tela (número de colunas), subtraia a largura do argumento da string ( ${#1} e divida por dois. Isso calcula o número de caracteres que você pode ter à esquerda e à direita da string e ainda tem a linha encaixada no terminal. Por exemplo, para uma sequência de 10 caracteres em uma tela de 80 colunas, margin será 35 (porque 35 + 10 + 35 = 80).
  • O comando final parece um pouco com grep -o "$@" , mas nós fazemos grep -o "$1" "${@:2}" . "${@:2}" é uma base que significa "$@" , mas a partir de $2 (se houver).
  • Envolvemos $1 com .\{,$margin\} - por exemplo, .\{,35\} - antes e depois. Isso corresponde a até 35 de qualquer caractere, Assim, no total, nosso padrão corresponde a até 80 caracteres. com o original $1 no meio.
  • -o significa a saída apenas do texto correspondente - então nós produzimos no máximo 80 caracteres por linha.

Eu usei este texto de exemplo:

Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping, As of some one gently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber door— Only this and nothing more.”

e aqui está um exemplo executado em uma tela de 80 colunas:

$ ./greptrim or raven.txt
r many a quaint and curious volume of forgotten lore—
ently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber d
oor— Only this and nothing more.”

Observe que a string "ou" aparece seis vezes no verso: "F ou obtido", "l ou e", "fazer ou ", "visitar ou ", “Do ou ” e “m ou e”. Note que temos a terceira linha da entrada duas vezes porque "visit ou " e "do ou " têm mais de 39 caracteres de diferença.

Mais notas:

  • Obviamente, o script pode ser estendido para lidar com opções. Apenas se torna complicado descobrir qual argumento é o padrão e qual (is) são o (s) nome (s) do arquivo (s).
  • Se você sempre quiser usar algumas opções, como -i , basta adicioná-lo ao comando grep no script.
  • Se você adicionar -n , deverá subtrair 4 ou 5 de cols .
  • Você pode usar o script com um padrão isso é mais complexo que uma string simples mas os resultados podem ser insatisfatórios, porque um regex curto pode corresponder a um segmento de texto longo (ou vice-versa), então o cálculo de margin estará errado, e você pode obter mais (ou menos) do que 80 caracteres por linha.
  • Se você adicionar -E , você deve alterar a regex de margem para .{,$margin} (remover as barras invertidas).
  • Um recurso opcional é alterar a última linha para

    grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}" | grep --color=auto "$1"
    

    para realçar a string de pesquisa:

    Notequeo"ou" em "esquecido" se alinha perfeitamente com o "ou" em "porta". Isso vai acontecer em geral para sequências que aparecem mais de margin caracteres desde o início da linha.

por 12.02.2018 / 06:20