grepで固定文字列を見つける方法は?

grepで固定文字列を見つける方法は?

grep目的の出力が表示されない場合は、どのように固定文字列を見つけることができますかgrep -F?たとえば、

egrep -r 'string1|string2|string3' /var/www/http

これで私たちは何を使うべきですか?

ベストアンサー1

grep -E(の現代的な形式egrep)を使用すると、|拡張正規表現として扱われます。交互に演算子ですが、他のすべての正規表現演算子(たとえば、、、、、、、、、、、、、、など).をエスケープする必要があります。?*^$\[(){}固定文字列

または、-F1行に1つ以上の文字列を使用して渡します-e

grep -Fe string1 -e string2 -e string3

または:

grep -F 'string1
string2
string3'

-xこれらの固定文字列が(どこにも見つからず)完全一致行を構成する必要がある場合は、このオプションを追加します。以内にその行はありません。)ほとんどの実装には次のオプションgrepもあります。-w言葉たとえば、where一致はstring1insideと一致しますfoo string1-2が、insideと一致しませんfoostring12

コメントの具体例は次のとおりです。

grep -wE 'Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll'

または:

grep -we 'Allow from 8.8.2.5' -e 'Allow from 192.3.0.4' -e 'DenyAll'

-wまたは、ここを使用する必要があります-x(周囲にスペースがなくても全体の行であると仮定)。それ以外の場合と同じ行も一致しますAllow from 8.8.2.51

次のように書くこともできます。

grep -xE '[[:space:]]*(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)[[:space:]]*'

行全体 ( -x) と一致しますが、先頭と末尾の空白文字を受け入れます。[[:space:]]代わりに、ここを使用すると、[[:blank:]]MS-DOSの世界で行末にあるCR文字も許可されます。

コメントの内側ではない行のどこでもこれらの固定文字列を見つけるには、これらの固定文字列につながる行部分に文字が含まれていないことを確認する必要があります#。だからこんな感じ:

grep -wE '^[^#]*(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)'

一致する文字列全体に適用されるため、-w適用されません。Allowたとえば、と一致しますGAllow from。一部のgrep実装\<では\>一致をサポートしています。単語の境界明示的に(特定とも呼ばれる\b):

grep -E '^[^#]*\<(Allow from (8\.8\.2\.5|192\.3\.0\.4)|DenyAll)\>'

また、apache2構成ディレクティブは大文字と小文字を区別せず、単語間にスペースを入れることができます。また、Deny from all代わりを意味すると思うので、DenyAll次のことをしたいかもしれません。

grep -iE '^[^#]*\<(allow[[:blank:]]+from[[:blank:]]+(8\.8\.2\.5|192\.3\.0\.4)|deny[[:blank:]]+from[[:blank:]]+all)\>'

おすすめ記事