Uma seção de grep --help
é:
-E, --extended-regexp PATTERNS are extended regular expressions
-F, --fixed-strings PATTERNS are strings
Existem muitos exemplos on-line para o -E
, mas não consigo encontrar nenhum para-F
Eu não sou muito bom com regex e evito-o se possível, então isso -F
parece uma opção melhor.
Qual é a sintaxe para grep algo e ver se contém 3 strings diferentes?
A
-F
opção ou--fixed-string
, como você observou, desabilite o mecanismo regexp e procure por strings literais. É útil procurar strings que sejam expressões regulares válidas, mas que tenham um significado diferente como tal. Por exemplo:O
[warn]
padrão é uma Expressão Regular Básica (BRE
) válida e, portanto, sem a-F
opçãogrep
, pesquisará e capturará qualquer linha com pelo menos um dew
,a
,r
oun
. (Observe que os colchetes também são especiais no shell, portanto, precisamos citá-los na linha de comando.)Como exemplo, suponha que queremos encontrar as mensagens de erro de um arquivo de log como o seguinte com linhas como esta (portanto, as linhas com a
[err]
tag):O uso
grep 'err'
corresponderia a ambas as linhas, pois há um acerto na palavra "t err ace".grep '[err]'
também corresponderia a ambas as linhas, pois ambas têm um "e" (e um "r"). Mas aqui,grep -F '[err]'
seria uma maneira simples de limitar a correspondência apenas às tags. (Como alternativa, pode-se usar a correspondência de regex padrão e escapar dos colchetes:grep -e '\[err\]'
,grep -e '[[]err[]]'
ou até mesmogrep '[[]err]'
. Mas isso é mais feio.)Se você tiver mais padrões para pesquisar, poderá usar a
-e
opção várias vezes:As linhas correspondentes a qualquer um dos padrões (pelo menos um) serão correspondidas.
A opção
-x
,--line-regex
também pode ser útil neste contexto, pois significa que só considera uma linha uma correspondência se a linha inteira corresponder ao padrão. Por exemplogrep -x foo
, corresponderá se uma linha for,foo
mas não se a linha forfoobar
. E-Fx
juntos só encontrariam linhas exatamente correspondentes, quaisquer que sejam os caracteres especiais que contenham.Para obter as linhas
test.txt
que têm pelo menos uma das stringshello
ougoodbye
, você usaria:Ou seja, os padrões a serem procurados são fornecidos como argumentos para as
-e
opções, e a-F
opção diz para tratá-los como strings fixas. Bem, isso não importa com o acima, mas, por exemplo, um padrão comoa.*b
procurariaa
, um ponto, um asterisco e umb
, em vez da interpretação regex que seriaa
eb
com qualquer coisa entre eles.Alternativamente, você pode colocar as strings procuradas em um arquivo, uma por linha, e usar a
-f
opção para fornecer o nome do arquivo:(Observe que seria muito mais difícil fazer o teste de "todas as strings fornecidas". É bastante estranho, mesmo com regexes.)