.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가 이 문제를 어떻게 해결하는지 모르겠습니다.