grepを使用してファイルのリストを取得する簡単なスクリプトを作成したいと思います。現在のコードは次のようになります。
a= file1.txt
b= file2.txt
for
do
grep '$a.*$b' /root/listoffiles/*php >> found.txt
完璧
file1
どちらfile2
も単語のリストです。したがって、複数の基準を使用して目的地を検索します。たとえば、$a
「hello」と「world」になり、$b
2行目が「red」と「tshirt」になります。 2つの条件が一致するものが見つかったら、ファイルに保存します。私が使っているループはうまくいかず、十分に効率的ではありません。私は基準に合った結果が欲しいだけです。どんな提案がありますか?
答え1
あなたが最初にする必要があります特殊文字脱出両方のファイルに(存在する場合)それからそれを結合します。たとえば、 'paste
で使用できるパターンのリストが作成されます。ファイルが多すぎない限り、複数の引数を持つループは必要ありません。受け入れることができます:grep
-f
grep
paste -d'.*' <(sed 's/[.[\*^$]/\\&/g' file1.txt) /dev/null \
<(sed 's/[.[\*^$]/\\&/g' file2.txt) | grep -f - /root/listoffiles/*php >> found.txt
答え2
単語リストからパターンを作成します。 、、、、file1.txt
および包含から正規表現を取得する必要があります(ERE構文から)。one
un
eins
file2.txt
two
deux
zwei
(one|un|eins).*(two|deux|zwei)
単語リストに正規表現の特殊文字が含まれていない場合は、|
改行文字(最後の文字を除く)を(「or」演算子)に置き換えるだけです。
words1=$(tr '\n' '|' <file1.txt); words1=${words1%\|}
words2=$(tr '\n' '|' <file2.txt); words2=${words2%\|}
grep -E "($words1).*($words2)"
単語リストに特殊文字を含めることができる場合は、その文字を引用する必要があります。
words1=$(<file1.txt tr '\n' '|' | sed 's/[][\\().*?+|]/\\&/g'); words1=${words1%\|}
words2=$(<file2.txt tr '\n' '|' | sed 's/[][\\().*?+|]/\\&/g'); words2=${words2%\|}
grep -E "($words1).*($words2)"
単語の順序を気にせずに重複一致を許可できる場合(たとえば、両方をtwone
許可)、grep呼び出しは2回だけ必要です。one
two
grep -f file1.txt | grep -f file2.txt