grep -A 2 -B 3
imprime 2 linhas após a sequência grep e imprime 3 linhas antes.
grep -C 3
imprime 3 linhas antes e 3 linhas depois
Infelizmente, o grep
que estou usando não suporta essas opções. Existem comandos ou scripts alternativos disponíveis para simular isso? Usando scripts sed
/ awk
/ perl
/ shell?
text-processing
grep
awk
perl
Prashant Bhate
fonte
fonte
-C
interruptor.GNU > /usr/local
. Os programas GNU têm muitas extensões muito úteis e são projetados para evitar restrições arbitrárias (mas você paga muito caro em tamanho e, às vezes, desempenho). Muitos sistemas proprietários possuem repositórios de pacotes "não oficiais" com o GNU e outras ferramentas. O "parceiro" não vai falar sobre eles, mesmo quando eles são gerenciados pelo fornecedor ...Respostas:
Uma maneira moderadamente feia de fazer isso é
ou substitua
-c
por-C NUM
paraNUM
linhas de contexto. Porém, produzirá uma saída extra. (Se o seudiff
suporte-u
/-U NUM
, será mais limpo.)Se o seu
diff
não tiver-c
/-C
/-u
, ainda existem maneiras de fazê-lo, mas são muito feias. Por outro lado, um sistemadiff
que nem suporta-c
provavelmente também não possui Perl.fonte
grep -v pattern file | diff -c - file
ack requer apenas Perl, e inclui
-A
,-B
e-C
opções que funcionam como grep do. Ele usa a sintaxe regex do Perl em vez do grep, e a maneira como ele seleciona os arquivos a serem pesquisados é bem diferente. Você pode tentar a-f
opção ao usá-la (que imprime os arquivos que serão pesquisados sem realmente pesquisar nada).Ele pode ser instalado como um único script que não requer módulos não essenciais. Basta soltá-lo em seu
~/bin
diretório (ou em qualquer outro lugar do seu PATH ao qual você tenha acesso de gravação) e verifique se ele échmod
executável.fonte
ack
para seu próprio uso.Este script perl simples emula
grep -A
até certo pontoObserve que você pode adicionar uma declaração de uso, para tornar o script legível e utilizável;)
fonte
grep-A 3 foo
parece muito mais natural do quegrep-A foo 3
. :-) #Você pode simplesmente instalar o GNU grep ou o Ack (escrito em Perl, entende muitas das opções do GNU grep e muito mais).
Se você preferir seguir as ferramentas padrão mais um pouco de script, aqui está um script awk que emula o comportamento das opções
-A
e grep do GNU-B
. Minimamente testado.Executá-lo como
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
ondePATTERN
é o padrão para procurar (uma expressão regular estendida com algumas adições awk ), eNBEFORE
eNAFTER
são os números de linhas a serem impressas antes e depois de uma partida, respectivamente (inadimplente a 0). Exemplo:fonte
{ "exec" "awk" "-f" "$0" "$@"; }
: maneira muito bacana de contornar as limitações na análise de linha shebang.Acontece que é bastante difícil imitar -B, devido aos problemas que surgem quando as linhas correspondentes são seguidas diretamente. Isso praticamente não permite o uso de qualquer tipo de verificação de arquivo de passagem única.
Percebi isso enquanto brincava com a seguinte aproximação:
Isso funcionará aproximadamente corretamente, como faria o grep -A7 -B3, com a ressalva descrita no primeiro parágrafo.
Uma solução alternativa (também de arquivo único) para esse problema é usar o perl para alimentar uma sequência de comandos:
fonte
shift @A if push(@A,$_)>7;
bit mantém apenas uma matriz de tamanho máximo 7. (esse é o seu parâmetro -A). A segunda opção mantém um arquivo incrivelmente pequeno (basta executar o perl sem a camada externa sed para ver o que é gerado lá), mas ele lê o arquivo duas vezes.Usando
sed
você, você pode obter primeiro o número de linhas correspondentes, diminuir e incrementar um determinado número de linha em umwhile
loop e depois usá-losed -n "n1,n2p"
para imprimir linhas dos contextos inicial (n1
) e final (n2
) (semelhante àsed
alternativa sugerida pelo usuário455). Muitos processos de leitura podem levar a um impacto no desempenho.ed
pode referenciar diretamente as linhas anteriores e seguintes de uma linha correspondente, mas falha se o intervalo de linhas especificado não existir; por exemplo, a linha correspondente é a linha número 2, mas 5 linhas anteriores à correspondência devem ser impressas. Usandoed
-o, por conseguinte, é necessário adicionar um número adequado de linhas (vazio) no início e no final. (Noed
entanto, para arquivos grandes, pode não ser a ferramenta certa, consulte: bfs - scanner de arquivos grandes ).fonte