grep 并输出整个单词

grep 并输出整个单词

我有一个很长的 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

相关内容