Respostas:
Simplesmente especifique as âncoras regexp.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Na página de manual do grep:
-F, --fixed-strings
Interpretar PATTERN como uma (lista de) strings fixas
-x, --line-regexp
Seleciona apenas as correspondências que correspondem exatamente a toda a linha.
-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:
grep -w "ABB.log " a.tmp
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:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
Um simples loop while-read no shell faria isso implicitamente:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
da mesma forma com awk
awk '/^ABB\.log$/' file
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:
grep -x "ABB\.log" a.tmp
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 ( .
):
grep -x ABB\\.log a.tmp
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-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 $
.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:
echo -f |grep -- "-f" # where grep "-f" will show error
echo -f |grep -F -- "-f" # whre grep -F "-f" will show error
grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename
-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 com grep
")
-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:
grep -F ABB.log a.tmp
$ cat venky
ABB.log
ABB.log.122
ABB.log.123
$ cat venky | grep "ABB.log" | grep -v "ABB.log\."
ABB.log
$
$ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
ABB.log.122
$
Funciona para mim :
grep "\bsearch_word\b" text_file > output.txt
\b
indica / define limites.
Parece funcionar muito rápido
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
Eu preferia:
str="ABB.log"; grep -E "^${str}$" a.tmp
Felicidades
ABBxlog
Eu precisava desse recurso, mas também queria ter certeza de não retornar linhas com um prefixo antes de ABB.log:
grep "\WABB.log$" -w a.tmp
\W
for satisfeito, que é qualquer caractere sem espaço em branco, portanto xABBxlog
.