Eu quero executar ack ou grep em arquivos HTML que geralmente têm linhas muito longas. Não quero ver linhas muito longas que se quebram repetidamente. Mas eu quero ver apenas aquela parte de uma linha longa que envolve uma string que corresponde à expressão regular. Como posso fazer isso usando qualquer combinação de ferramentas Unix?
91
ack
? É um comando que você usa quando não gosta de algo? Algo assimack file_with_long_lines | grep pattern
? :-)ack
(conhecido comoack-grep
no Debian) usagrep
esteróides. Também tem a--thpppt
opção (não é brincadeira). betterthangrep.com--thpppt
recurso é um tanto controverso, a principal vantagem parece ser que você pode usar Perl expressões regulares diretamente, e não algum louco[[:space:]]
e personagens como{
,[
, etc. mudando significando com o-e
e-E
muda de uma forma que é impossível lembrar.Respostas:
Você pode usar a opção grep
-o
, possivelmente em combinação com a alteração de seu padrão para".{0,10}<original pattern>.{0,10}"
, a fim de ver algum contexto em torno dele:..ou
-c
:fonte
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
impressõesqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
oE ".{0,20}mysearchstring.{0,20}"
você perde o destaque da string "original" interna em relação ao contexto, porque a coisa toda se torna o padrão de pesquisa. Adoraria encontrar uma maneira de manter algum contexto não destacado em torno dos resultados da pesquisa, para facilitar a digitalização visual e a interpretação dos resultados.-oE ".{0,x}foo.{0,x}"
abordagem (ondex
está o número de caracteres do contexto) - anexar `| grep foo `até o fim. Funciona para soluções ack ou grep. Mais soluções também aqui: unix.stackexchange.com/questions/163726/…Canalize seus resultados
cut
. Também estou pensando em adicionar um--cut
switch para que você possa dizer--cut=80
e obter apenas 80 colunas.fonte
| cut=c1-120
ao grep, funcionou para mim (embora não saiba como cortar o texto correspondente)| cut=c1-120
não funcionou para mim, eu precisava fazer| cut -c1-120
| cut -c 1-100
stackoverflow.com/a/48954102/1815624--no-wrap
opção que usa$COLUMNS
?Você poderia usar o less como um pager para ack e cortar linhas longas:
ack --pager="less -S"
isso mantém a linha longa, mas a deixa em uma linha em vez de quebrar. Para ver mais da linha, vá para a esquerda / direita em menos com as teclas de seta.Tenho o seguinte alias configurado para ack para fazer isso:
fonte
--pager
comando em seu arquivo ~ / .ackrc, se sempre quiser usá-lo.ack
.ack
é muito parecidogrep
, apenas mais simples nos casos mais comunsobtém caracteres de 1 a 100.
fonte
Retirado de: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
A abordagem sugerida
".{0,10}<original pattern>.{0,10}"
é perfeitamente boa, exceto pelo fato de que a cor de realce costuma ser confusa. Eu criei um script com uma saída semelhante, mas a cor também é preservada:#!/bin/bash # Usage: # grepl PATTERN [FILE] # how many characters around the searching keyword should be shown? context_length=10 # What is the length of the control character for the color before and after the # matching string? # This is mostly determined by the environmental variable GREP_COLORS. control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1)) control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1)) grep -E --color=always "$1" $2 | grep --color=none -oE \ ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"
Supondo que o script seja salvo como
grepl
,grepl pattern file_with_long_lines
deve exibir as linhas correspondentes, mas com apenas 10 caracteres ao redor da string correspondente.fonte
Na situação incomum em que você não pode usar
-E
, você pode usar:fonte
Aqui está o que eu faço:
No meu .bash_profile, eu sobrescrevo grep para que ele seja executado automaticamente
tput rmam
antes etput smam
depois, o que desabilitou o empacotamento e então o reativou.fonte
Eu coloco o seguinte em meu
.bashrc
:Você pode então usar
grepl
na linha de comando com quaisquer argumentos disponíveis paragrep
. Use as setas do teclado para ver a cauda das linhas mais longas. Useq
para sair.Explicação:
grepl() {
: Defina uma nova função que estará disponível em cada (novo) console bash.$(which grep)
: Obtenha o caminho completo degrep
. (Ubuntu define um alias paragrep
isso é equivalente agrep --color=auto
. Não queremos esse alias, mas o originalgrep
.)--color=always
: Colorir a saída. (--color=auto
do alias não funcionará, poisgrep
detecta que a saída é colocada em um tubo e não a colorirá.)$@
: Coloque todos os argumentos fornecidos para agrepl
função aqui.less
: Exibir as linhas usandoless
-R
: Mostrar coresS
: Não quebre longas filasfonte