두 개 이상의 문자열에 대한 파일 검색

두 개 이상의 문자열에 대한 파일 검색

내 데이터베이스 서버(유닉스 박스)에 SQL 파일이 있습니다. 테이블의 특정 열을 사용하는 *.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을 사용하십시오(-엘):("-최대 깊이 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

관련 정보