Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Grep使用Find命令搜索带换行符的字符串_Unix_Grep_Find - Fatal编程技术网

Unix Grep使用Find命令搜索带换行符的字符串

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'

我正在尝试在所有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,我能够使用它构建解决方案!