我有很多.ini文件,可以为各种项目配置某些属性。
我想首先在ini文件中过滤PROJECT_A,如果匹配,那么我想过滤第二种模式CONFIG_B。由于CONFIG_B是PROJECT_A ... X的属性,我想只grep包含PROJECT_A设置的文件,并且还存在CONFIG_B。我知道它有点挑战,但如果我可以缩小ini文件同时存在PROJECT_A和CONFIG_A,我可以手动检查它们到最小列表。我有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的行 找 。 -name * .ini -exec grep -w PROJECT_A {} \; -print | 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 grep一行
我知道我可以将它写入文件并一次读取一行,但我想要一种有效的方法来执行此操作。
请帮助您提出建议。
答案 0 :(得分:1)
话说:
find . -name *.ini -exec sh -c "grep -q PROJECT_A {} && grep -q CONFIG_A {} && echo {}" \;
会列出同时包含PROJECT_A
和CONFIG_A
的文件。
只有当文件中存在指定的模式时,才使用-q
的{{1}}选项评估为grep
。
答案 1 :(得分:0)
find . -name *.ini -exec sh -c "grep -q PROJECT_A {} && grep -q CONFIG_A {} && echo {}" \;
它如何运作?
find . -name *.ini <= filters the .ini files
-exec <= executes the following command using the output from find one at a time
sh -c <= accepts string input for the shell, we need this for executing multiple commands which follws that
grep -q PROJECT_A {} <= quietly grep for PROJECT_A
grep -q PROJECT_A {} && grep -q CONFIG_A {} && echo {} <= prints the filename if both the strings are matches, simple logical and on three commands.
希望它有所帮助!!!
答案 2 :(得分:0)
如果您正在寻找只在CONFIG_B
的节中出现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 }' {} \;
答案 3 :(得分: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