1

おそらくファイルの異なる部分にstr1とstr2があるファイルの名前を特定する方法を見つけようとしています。grep str1 | grep str2はstr1を含む行で動作するため、grepstr2は機能しません。str1を含むファイルのリストと、str2を含むファイルのリストを取得して、交差点を探すことができますが、これは非効率的です。より効率的な方法は、grep str1にファイルのリストを出力させてから、grep str2をその上で動作させることですが、これは、grepが同じファイルを何度も開いたり、読み取ったり、閉じたりすることを意味します。おそらく最も理想的な方法は、str1とstr2のgrepファイルを開いて、ファイルにstr1とstr2の両方が含まれているかどうかを確認することですが、そのようなコマンドを作成することはできません。私はそれがこの発見に似ているはずだと思います。-name "*" -exec grep "str1" && grep "

4

5 に答える 5

2

GNU awk (gawk) を使用する場合:

awk -v RS='\0' -v str1="$str1" -v str2="$str2" '
   index($0,str1) && index($0,str2) { print FILENAME; nextfile }
' file1 file2 filen

任意の awk で:

awk -v str1="$str1" -v str2="$str2" '
   FNR == 1             { found[1] = found[2] = 0 }
   index($0,str1)       { found[1]++ }
   index($0,str2)       { found[2]++ }
   found[1] && found[2] { files[FILENAME] }
   END { for (file in files) print file }
' file1 file2 filen
于 2013-01-05T17:01:18.207 に答える
0

このタスクには awk の方が適していると思います。これを行う方法の 1 つを次に示します。

awk -v str1="$str1" -v str2="$str2" '
  FNR == 1 { m1 = m2 = 0 }
  index($0, str1) { m1 = 1 }
  index($0, str2) { m2 = 1 }
  m1 && m2 { print FILENAME; nextfile }' file1 file2 filen

$str1これは、とが検索する文字列に設定されていることを前提として$str2います。ソリューションは 1 つのパスで一致を実行し、両方の文字列が見つかるとすぐに終了します。

少し最適化されたバージョン:

awk -v str1="$str1" -v str2="$str2" '
  FNR == 1 { m1 = m2 = 0 }
  !m1 && index($0, str1) { m1 = 1 }
  !m2 && index($0, str2) { m2 = 1 }
  m1 && m2 { print FILENAME; nextfile }' file1 file2 filen

アップデート:

以下のコメントでEd Mortonが言及したバグ修正と最適化を追加しました。また、古いバージョンの awk のステートメントには、移植性の問題がある可能性があることに注意してください。GNU awk の付録 Bnextfileで、この件に関する議論を参照してください。このステートメントはPOSIX 標準に含めることが認められているため、将来的にはさらに広く利用できるようになるはずです。nextfile

于 2013-01-05T15:35:31.057 に答える
0
于 2013-01-05T14:20:48.423 に答える
-1

のような正規表現を使用してみてください(str1.*str2|str2.*str1)egrepよくわかりませんが、代わりに使用する必要があるかもしれませんgrep

于 2013-01-05T14:23:35.447 に答える
-2

If str1 occurs before str2 then you can use

find . -name "str1*str2"
于 2013-01-05T14:21:45.230 に答える