我有一个很长的 SQL 命令日志文件,我对 grep 表名很感兴趣。例如:
SELECT * FROM table_02323
SELECT * FROM table_231
SELECT * FROM table_1
我想 grep 以便结果返回
table_02323
table_231
table_1
我得到的最接近的东西是,grep -o 'table.....' this.log
但显然后缀会有不同的长度。是否有一个正则表达式可以输出而不受固定长度的限制,就像使用句点的情况一样?
答案1
这将匹配“table_”后跟 0 个或多个 ASCII 数字:
grep -o 'table_[0-9]*' this.log
答案2
使用 GNUgrep
如下:
grep -oiP 'FROM\s*\K\w+' infile
非 GNU:
grep -ioP 'FROM[ ]*\K[A-Z_0-9]+' infile
这将确保您只是获得表名。
测试:
grep -ioP 'FROM\s*\K\w+' <<<"SELECT * FROM table_02323 where 1=1"
table_02323
答案3
从man grep
:
Repetition A regular expression may be followed by one of several repetition operators: ... * The preceding item will be matched zero or more times.
所以你想使用类似的东西
$ grep -o 'table\w*'
其中\w
是任意非空白字符,重复零次或多次。
答案4
另一种方法是使用lookbehind:
$ grep -P -o -e '(?<=^SELECT \* FROM )(.*$)' < 'file'
table_02323
table_231
table_1