grep
目的の出力が表示されない場合は、どのように固定文字列を見つけることができますかgrep -F
?たとえば、
egrep -r 'string1|string2|string3' /var/www/http
これで私たちは何を使うべきですか?
答え1
grep -E
(の現代的な形式egrep
)を使用すると、|
拡張正規表現として扱われます。交互に演算子ですが、他のすべての正規表現演算子(たとえば、、、、、、、、、、、、、、など).
をエスケープする必要があります。?
*
^
$
\
[
(
)
{
}
固定文字列。
または、-F
1行に1つ以上の文字列を使用して渡します-e
。
grep -Fe string1 -e string2 -e string3
または:
grep -F 'string1
string2
string3'
-x
これらの固定文字列が(どこにも見つからず)完全一致行を構成する必要がある場合は、このオプションを追加します。以内にその行はありません。)ほとんどの実装には次のオプションgrep
もあります。-w
言葉たとえば、where一致はstring1
insideと一致します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)\>'
答え2
問題は
grep -F -r 'string1|string2|string3' /var/www/http
string1|string2|string3
ファイル内のテキスト文字列を見つけることができます。固定文字列を探しているのでegrep
(またはgrep -E
)を使用する理由はありません。
できることは使用するだけです
printf '%s\n' 'string1' 'string2' 'string3' | grep -f /dev/stdin -F -r /var/www/http
これにより、grep
固定文字列が標準入力(提供)から読み取られ、printf
それを使用して指定されたディレクトリ内のすべてのファイルから一致するすべての行を取得します。
別々の行パターンでテキスト文書を生成するすべての項目は、printf
単純なテキストファイル(から直接読み取ることができますgrep -f textfile -F ...
)を含む上記の内容を置き換えることができます。
あなたのコメントの例:
次のファイルで文字列を見つけて、次の操作を行いますAllow from 8.8.2.5
。Allow from 192.3.0.4
DenyAll
$dirpath
printf '%s\n' 'Allow from 8.8.2.5' 'Allow from 192.3.0.4' 'DenyAll' |
grep -f /dev/stdin -F -r "$dirpath"
答え3
パイプは次のようにエスケープする必要が|
あります\|
。
grep 'string1\|string2\|string3\' /var/www/http