Unix Grep使用Find命令搜索带换行符的字符串
我正在尝试在所有settings.ini文件中搜索,并确定其中哪些文件包含特定的多行字符串 我的目录结构如下所示Unix Grep使用Find命令搜索带换行符的字符串,unix,grep,find,Unix,Grep,Find,我正在尝试在所有settings.ini文件中搜索,并确定其中哪些文件包含特定的多行字符串 我的目录结构如下所示 / |-- folder |---- settings.ini |-- folder |---- settings.ini |-- folder |---- settings.ini |-- folder |---- settings.ini . . . [NeatFeature] Enabled=1 find . -maxdepth 2 -name 'settings.ini'
/
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
.
.
.
[NeatFeature]
Enabled=1
find . -maxdepth 2 -name 'settings.ini' -exec grep '\[TransactionalMessageSearch\]' {} +
我要找的绳子是这样的
/
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
.
.
.
[NeatFeature]
Enabled=1
find . -maxdepth 2 -name 'settings.ini' -exec grep '\[TransactionalMessageSearch\]' {} +
文件本身将包含Enabled=1或Enabled=0
我可以让单行搜索像这样工作
/
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
|-- folder
|---- settings.ini
.
.
.
[NeatFeature]
Enabled=1
find . -maxdepth 2 -name 'settings.ini' -exec grep '\[TransactionalMessageSearch\]' {} +
问题是我不知道如何也包括Enabled=1部分。我不能自己搜索,因为这种模式在不同标题下的文件中多次出现
有什么想法吗?尝试添加
-A
在比赛结束后添加一些行,可能:
grep -A 2 xyz file
这取决于搜索字符串和附加信息之间可能有多少行。尝试添加
-A
在匹配后添加一些行可能:
grep -A 2 xyz file
这取决于搜索字符串和附加信息之间可能有多少行。请尝试以下操作:
find . -name 'settings.ini' | xagrs grep 'Enabled=1'
试试这个:
find . -name 'settings.ini' | xagrs grep 'Enabled=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,我不知道有什么方法可以做到这一点,因此如果没有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
,字段之间用=
符号分隔。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,我不知道有什么方法可以做到这一点,因此如果没有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
,字段之间用=
符号分隔。多亏了Mark的建议,我才能够通过管道输出并让grep通过它获得我想要的结果集
find . -maxdepth 2 -name 'settings.ini' -exec grep -HA 1 '\[TransactionalMessageSearch\]' {} \; | grep 'Enabled=1'
多亏了Mark的建议,我才能够通过管道输出并让grep通过它获得我想要的结果集
find . -maxdepth 2 -name 'settings.ini' -exec grep -HA 1 '\[TransactionalMessageSearch\]' {} \; | grep 'Enabled=1'
pcregrep的可能副本对我不可用,不幸的是,这不是此处列出的唯一方法。pcregrep的可能副本对我不可用不幸的是,这不是此处列出的唯一方法。这不起作用,因为文件中的其他位置可能已启用=1,但不是在对我来说很重要的标题下。这不起作用,因为文件中的其他地方可能有Enabled=1,但在对我来说很重要的标题下不起作用。因此,这可以起作用,但在我的环境中不起作用,因为我没有能力在此服务器上创建文件,所以需要能够将其作为一个命令运行。因此,这可以起作用,但在我的环境中不是这样,因为我没有能力在此服务器上创建文件,所以需要能够将其作为一个命令运行。感谢Mark,我能够使用它构建解决方案!感谢Mark,我能够使用它构建解决方案!