如何在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解决这个问题。

相关内容