使用“查找”命令使用换行符搜索字符串

时间:2014-07-25 17:39:44

标签: unix grep find

我尝试在所有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部分。我不能在它自己上搜索它,因为在不同的标题下,这些模式会在整个文件中多次出现。

有什么想法吗?

4 个答案:

答案 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'