使用grep SQL数值数据类型进行搜索

时间:2013-12-20 17:24:21

标签: regex linux grep

我正在尝试使用grep列出包含linux系统上特定字符串变体的目录中的所有文件。这些文件是存储过程的DDL,我正在寻找具有精度为2的NUMERIC或DECIMAL声明的所有文件(即DECIMAL(x,2)或NUMERIC(x,2))。不区分大小写,并且空格将被忽略。

示例:

DECIMAL(13,2)
DECIMAL(13, 2)
DECIMAL( 13, 2 )
Decimal(13 , 2)
DECIMAL     ( 13, 2    )
NUMERIC(13         , 2)
numeric ( 13 , 2)
NUMERIC(8,2      )
CAST(INT (PURCHASE_DATE ) AS NUMERIC(8,0)) AS BUYDATE;

到目前为止我想出的是:

grep --include='*.DDL' -inP 'sproc' -e '.*Numeric|Decimal *\( *[0-9] *\, *2 *\).*'

但当然,它不起作用,我只是错过了原因。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

由于你使用-P,你应该为每个空间使用caracter类或scapes

grep --include='*.DDL' -inP -e '.*Numeric|Decimal[ ]*\([ ]*[0-9][ ]*\,[ ]*2[ ]*\).*'

grep --include='*.DDL' -inP -e '.*Numeric|Decimal\s*\(\s*[0-9]\s*\,\s*2\s*\).*'

甚至:

grep --include='*.DDL' -inP -e '.*Numeric|Decimal\ *\(\ *[0-9]\ *\,\ *2\ *\).*'

我个人更喜欢第一个,对我来说似乎更清楚。

为了说清楚,-i也会使搜索案例不敏感。

答案 1 :(得分:0)

我会像这样执行搜索:

grep --include='*.DDL' -inRP 'REGEX' *

有了这个REGEX:

(([Dd][Ee][Cc][Ii][Mm][Aa][Ll])|([Nn][Uu][Mm][Ee][Rr][Ii][Cc]))\s*\(\s*\d+\s*,\s*\d{1,2}\s*\)

将匹配您的示例,并且:

  

nUmErIc(1,3)

     

DeCiMaL(2,12)

不匹配:

  

DeCiMaL(1,123)

     

DeCiMaL(2,1 2)

如果您已使用-e,则不需要-P标记。此外,您需要指定要搜索的路径,我使用*,并在存在子文件夹时添加-R标记。