我必须使用 .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解决这个问题。