搜索文件中的两个或多个字符串

搜索文件中的两个或多个字符串

我的数据库服务器上有 SQL 文件,它是一个 unix 盒子。我试图找出使用表的特定列的 *.sql 文件。例如,内容my_dir/SALES_TERRITORY.sql

Select segment1,segment2
from HZ_CUST_SITE_USES_ALL
where territory_id = :p_territory_id;

所以,我的要求是,当我运行命令时,我应该获取具有“HZ_CUST_SITE_USES_ALL”和“territory_id”组合的所有文件。

我通过搜索互联网做了下面的事情,但没有得到所需的输出。

grep -i "HZ_CUST_SITE_USES_ALL\|TERRITORY_ID" *

我的期望是上面的命令会给我这样的结果

grep -i "HZ_CUST_SITE_USES_ALL\|TERRITORY_ID" my_dir/*

SALES_TERRITORY.sql

任何帮助深表感谢。

问候,

答案1

使用 grep 如下所示仅列出文件名(-l):(“-最大深度0" 是仅在 my_dir 下检查,并且不会检查其中的子目录。如果您还希望子目录也被检查,只需将其删除)

如果您的文件名中有空格,您可以使用如下:

find ./* -maxdepth 0 -type f -exec grep -qi "HZ_CUST_SITE_USES_ALL" {} \; -and -exec grep -li "TERRITORY_ID" {} \;

针对 Solaris 编辑:

find ./* -prune -type f -exec /usr/xpg4/bin/grep -qi "HZ_CUST_SITE_USES_ALL" {} \; -a -exec /usr/xpg4/bin/grep -li "TERRITORY_ID" {} \;

如果您确定文件名之间没有任何空格,则可以使用简单的 for 循环,如下所示:

for file in $(find my_dir/* -maxdepth 0 -type f)
do
  grep -qi "HZ_CUST_SITE_USES_ALL" "$file" && grep -il "TERRITORY_ID" "$file";
done

答案2

你可以用下面的方法来做到这一点:

grep -w "HZ_CUST_SITE_USES_ALL|TERRITORY_ID" file.txt

答案3

如果你的 grep 支持 PCRE 扩展,你可以使用:

grep -iP '(?s)(?=.*HZ_CUST_SITE_USES_ALL)(?=.*territory_id)' infile

相关内容