0

さまざまなプロジェクトの特定のプロパティを構成する .ini ファイルがたくさんあります。

最初にiniファイルでPROJECT_Aをフィルタリングし、それが一致する場合は、2番目のパターンCONFIG_Bをフィルタリングします。CONFIG_B は PROJECT_A...X のプロパティであるため、PROJECT_A の設定を含むファイルのみを grep したいのですが、CONFIG_B も存在します。少し難しいことは承知していますが、PROJECT_A と CONFIG_A の両方が存在する ini ファイルを絞り込むことができれば、最小限のリストに手動で検査できます。私はこのような1000個のファイルを持っています:-(

典型的な設定はこのようなものです

[F-Project:PROJECT_A]
stream-window-start=0
stream-window-end=0
network-feed=LIVE:
test-config=pdl tf_dms_hiab

予想外:-

file1.ini
proj:PROJECT_A
cfg1:CONFIG_A
cfg1:CONFIG_B
cfg1:CONFIG_C

proj:PROJECT_B
cfg1:CONFIG_A
cfg1:CONFIG_C

file2.ini
proj:PROJECT_X
cfg1:CONFIG_A
cfg1:CONFIG_B
cfg1:CONFIG_C

proj:PROJECT_Y
cfg1:CONFIG_B
cfg1:CONFIG_C

file3.ini
proj:PROJECT_A
cfg1:CONFIG_B
cfg1:CONFIG_C

proj:PROJECT_B
cfg1:CONFIG_A

結果: file1.ini、file3.ini

find . -name *.ini -exec grep -w PROJECT_A {} \; -print | grep ini -exec grep CONFIG_A {} \;

[proj:PROJECT_A]
./PLATFORM/build/integration/suites/System_Maintenance_Suite/ini/Test_0621_1.ini

上記のような出力が得られるので、.ini find を含む行のみをフィルタリングします。-name *.ini -exec grep -w PROJECT_A {} \; -印刷 | grep ini

./PLATFORM/build/integration/suites/System_Maintenance_Suite/ini/Test_0722_1.ini
./PLATFORM/build/integration/suites/System_Maintenance_Suite/ini/Test_0579_15.ini
./PLATFORM/build/integration/suites/System_Maintenance_Suite/ini/Test_0460_1.ini

パターンCONFIG_Aを一度に1行ずつgrepするにはどうすればよいですか

これをファイルに書き込んで一度に1行ずつ読み取ることができることは理解していますが、これを効率的に行う方法が必要です。

あなたの提案を手伝ってください。

4

4 に答える 4

1

言います:

find . -name *.ini -exec sh -c "grep -q PROJECT_A {} && grep -q CONFIG_A {} && echo {}" \;

PROJECT_Aと の両方を含むファイルをリストしますCONFIG_A

-qオプション forを使用すると、指定されたパターンがファイルに存在する場合にのみgrep評価されます。true

于 2013-09-19T16:29:50.853 に答える
0

CONFIG_Bスタンザ for でのみ発生するファイルを探している場合はproj:PROJECT_A、次のようになりますか?

find . -type f -name '*.ini' -exec awk '
    /^proj:/ { prj=$1; next }
    /CONFIG_B/ && prj="proj:PROJECT_A" {
        print FILENAME; exit 0 }' {} \;

...または以下のコメントからの「実際の」値を使用して、

find . -type f -name '*.ini' -exec awk '
    /^F-Project:/ { prj=$1; next }
    /LIVE:/ && prj="F-Project:PROJECT_A" {
        print FILENAME; exit 0 }' {} \;
于 2013-09-19T16:45:26.090 に答える
0

このきちんとした awk ソリューションはどうですか:

awk -vPR="PROJECT_A" -vCF="CONFIG_A" 'BEGIN{R="(" CF "|" PR ")"}
    {if($0 ~ R)d[FILENAME]+=1}
    END{for(i in d)if(d[i]>=2)print i}' file*
file3.ini
file1.ini
于 2013-09-19T16:45:45.200 に答える