Unix에서 awk를 사용하여 여러 줄 패턴 검색을 수행하는 방법은 무엇입니까?

Unix에서 awk를 사용하여 여러 줄 패턴 검색을 수행하는 방법은 무엇입니까?

.sql 스크립트를 사용하여 SQL 스크립트에서 여러 줄 패턴을 검색해야 합니다 awk.

샘플 스크립트 -

select * from dept where department_name in ('abc'
, 'xyz', 'def') ;

department_name in위의 예에서는 닫는 괄호의 패턴을 검색해야 하는데 )해당 패턴이 스크립트에 여러 번 나타날 수 있습니다.

위 예에서 "IN" 절의 값은 여러 행에 걸쳐 있습니다.

답변1

SQL이 ;명령문 구분 기호로 사용된다고 가정합니다.

$ cat statements.sql
First bit;
Second thing;

More
of the same;

select * from dept where department_name in ('abc'
, 'xyz', 'def') ;

Getting to the end;

The
End;

그런 다음 평소와 같이 ;레코드 구분 기호를 사용할 수 있습니다.awk

$ awk 'BEGIN { RS=";" } /department_name in ([^)]+)/ { print $0 ";" }' statements.sql


select * from dept where department_name in ('abc'
, 'xyz', 'def') ;

이 패턴은 /department_name in ([^)]+)/문자열 department_name in (과 하나 이상의 비문자 )(줄 바꿈 포함), ).

이 문은 레코드가 삭제되었기 때문에 레코드 끝에 print추가됩니다 (모든 레코드 구분 기호가 제거됨).;;awk

;파일의 이전 내용 뒤에 빈 줄이 있으므로 추가 빈 줄이 추가됩니다. 다음을 사용하여 필터링할 수 있습니다 sed -n '/[[:graph:]]/p'.

$ awk 'BEGIN {RS=";"} /department_name in ([^)]+)/ { print $0 ";" }' statements.sql |
  sed -n '/[[:graph:]]/p'
select * from dept where department_name in ('abc'
, 'xyz', 'def') ;

답변2

구분 기호를 사용 awk하고 기록 할 수 있습니다 RS.

$ cat << EOT | awk -v RS="department_name|)" 'NR%2==0'
> select * from dept where department_name in ('abc' , 
> 'xyz', 
> 'def') ;
> EOT
in ('abc' , 
'xyz', 
'def'

RS레코드가 여러 줄로 구성될 수 있도록 department_name또는 로 설정합니다 .)

두 개의 동일한 라벨이 없으면 NR%2=0서로 다른 두 라벨 사이의 모든 내용이 인쇄됩니다.

답변3

이것이 당신이 찾고 있는 대답이기를 바랍니다:

grep -oE 'department_name.*\)' file_name

PS awk가 이 문제를 어떻게 해결하는지 모르겠습니다.

관련 정보