我尝试在所有settings.ini文件中进行搜索,并确定哪些文件包含特定的多行字符串。
我的目录结构如下所示
/
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
.
.
.
我想找的字符串看起来像这样
[NeatFeature]
Enabled=1
文件本身将包含Enabled = 1或Enabled = 0
我能够像这样进行单行搜索
find . -maxdepth 2 -name 'settings.ini' -exec grep '\[TransactionalMessageSearch\]' {} +
问题是我无法弄清楚如何包含Enabled = 1部分。我不能在它自己上搜索它,因为在不同的标题下,这些模式会在整个文件中多次出现。
有什么想法吗?
答案 0 :(得分:1)
尝试添加-A
以在匹配后添加一些行:
grep -A 2 xyz file
这取决于搜索字符串与其他信息之间可能有多少行。
答案 1 :(得分:1)
试试这个:
find . -name 'settings.ini' | xagrs grep 'Enabled=1'
答案 2 :(得分:1)
Perl方法
perl -0777 -ne 's/.*\[TransactionalMessageSearch]\nEnabled=(\d)//s;print $1' settings.ini
原始答案
您也可以使用gawk
执行此操作,并使用find
+
功能在每个调用中测试多个文件:
将其另存为名为FeatureTest
#!/bin/bash
awk -F'=' '/\[TransactionalMessageSearch\]/{armed=1} armed==1 && /Enabled/{print FILENAME":"$2;armed=0;nextfile}' "$@"
然后执行此操作以使其可执行
chmod +x FeatureTest
然后你可以这样做:
find . -name 'settings.ini' -exec ./FeatureTest {} +
nextfile
函数是GNU awk的一部分,我不知道有没有这样做的方法,所以如果没有GNU,你必须按照以下方式解决这个问题。 AWK。
#!/bin/bash
awk -F'=' '/\[TransactionalMessageSearch\]/{armed=1} armed==1 && /Enabled/{print FILENAME":"$2;exit}' "$1"
并将其用于:
find . -name 'settings.ini' -exec ./FeatureTest {} \;
awk
脚本基本上会查找字符串[Transact...]
,当它找到它时,它会为下一次出现的单词Enabled
做好准备。当它发现武装后,它会打印第二个字段和文件名并移动到下一个文件(或退出)。由于=
位于开头,因此字段以-F
符号分隔。
答案 3 :(得分:1)
感谢Mark的建议,然后我能够管理输出并获取grep来获取我正在寻找的结果集
find . -maxdepth 2 -name 'settings.ini' -exec grep -HA 1 '\[TransactionalMessageSearch\]' {} \; | grep 'Enabled=1'