Eu tenho estes:
$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
Eu queria encontrar uma correspondência exata de ABB.log.
Mas quando eu fiz
$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
mostra todos eles.
Posso obter o que desejo usando o grep?
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Na página de manual do grep:
fonte
-F
? você está no Solaris? Se assim for, use/usr/xpg4/bin/grep
grep
dentro de um script bash e esta opção é melhor do que usar uma expressão regular, conforme sugerido na resposta aceita. Porque eu tenho algum caractere especial dentro da variável que estou procurando (como.
) e não preciso escapar deles ao usar o comando.Aqui está o que eu faço, embora usar âncoras seja a melhor maneira:
fonte
ABB.log
, o que não é o caso geral, ou seja, ele falhará na maioria das vezes.A maioria das sugestões falhará se houver um único espaço inicial ou final, o que faria diferença se o arquivo estivesse sendo editado manualmente. Isso o tornaria menos suscetível nesse caso:
Um simples loop while-read no shell faria isso implicitamente:
fonte
da mesma forma com awk
fonte
Pretendo acrescentar algumas explicações extras sobre as tentativas de OP e outras respostas também.
Você também pode usar a solução de John Kugelmans assim:
citar a string e escapar do ponto (
.
) faz com que ele não precise mais do-F
sinalizador.Você precisa escapar do
.
(ponto) (porque ele corresponde a qualquer caractere (não apenas.
) se não for escapado) ou usar a opção-F
com grep.-F
sinalizador torna uma string fixa (não um regex).Se você não citar a string, pode ser necessário barra invertida dupla para escapar do ponto (
.
):Teste:
Nota:
-x
forças para corresponder a toda a linha..
sem escape-F
estão erradas-x
troca envolvendo sua string de padrão com^
e$
. Neste caso, certifique-se de não usar-F
, em vez de escapar de.
, porque-F
impedirá a interpretação de regex de^
e$
.EDITAR: (Adicionando explicação extra em relação a @hakre):
Se você deseja combinar uma string começando com
-
, então você deve usar--
com grep. O que vier a seguir--
será considerado uma entrada (não uma opção).Exemplo:
fonte
-F
que não será necessário se o.
for escapado corretamente.-F
disponível quando você escreveu isso? Se não, qual sistema você estava usando? Não consegui encontrar essa informação em sua resposta até agora, o que até agora acontece quando eu a reli novamente. Com certeza, li sua resposta completamente pelo menos duas vezes. ;)-F
estava disponível. (Eu disse: "ou usar-F
sinalizar comgrep
")-F
for a resposta, por que se preocupar em fugir? Qual sua opinião sobre isso?Isso funcionou bem para mim ao tentar fazer algo semelhante:
fonte
fonte
Funciona para mim :
\b
indica / define limites.Parece funcionar muito rápido
fonte
search_word
separados por limites de palavras. Por exemplo, ele corresponderia à linha, "foo search_word bar".Isso é com HPUX, se o conteúdo dos arquivos tiver espaço entre palavras, use isto:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
fonte
Eu preferia:
Felicidades
fonte
ABBxlog
Eu precisava desse recurso, mas também queria ter certeza de não retornar linhas com um prefixo antes de ABB.log:
fonte
\W
for satisfeito, que é qualquer caractere sem espaço em branco, portantoxABBxlog
.