おそらくファイルの異なる部分に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 "
質問する
156 次
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 に答える