【问题标题】:Grep search strings with line breaks with the Find command使用 Find 命令 grep 搜索带有换行符的字符串
【发布时间】:2014-07-25 17:39:43
【问题描述】:

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

有什么想法吗?

【问题讨论】:

标签: unix grep find


【解决方案1】:

尝试添加-A 以在匹配后添加一些行:

grep -A 2 xyz file

这取决于搜索字符串和附加信息之间可能有多少行。

【讨论】:

  • 感谢 Mark,我能够使用它来构建解决方案!
【解决方案2】:

试试这个:

find . -name 'settings.ini' | xagrs grep 'Enabled=1' 

【讨论】:

  • 这行不通,因为文件中的其他地方可能有 Enabled=1,但不在对我很重要的标题下。
【解决方案3】:

Perl 方法

perl -0777 -ne 's/.*\[TransactionalMessageSearch]\nEnabled=(\d)//s;print $1' settings.ini

原答案

您也可以使用gawk 执行此操作,并使用find+ 功能在每次调用时测试多个文件:

将此保存为名为@9​​87654325@的文件

#!/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,因此这些字段由 = 符号分隔。

【讨论】:

  • 所以这行得通,但不适用于我的环境,因为我无法在此服务器上创建文件,因此需要能够将其全部作为一个命令运行。
【解决方案4】:

感谢 Mark 的建议,我能够通过管道输出并通过 grep 获取我正在寻找的结果集

find . -maxdepth 2 -name 'settings.ini' -exec grep -HA 1 '\[TransactionalMessageSearch\]' {} \; | grep 'Enabled=1'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多