如何使用 grep 通过正则表达式提取字符串?

如何使用 grep 通过正则表达式提取字符串?

说我有一个 SQL.txt

select * from table1;
select a,b,c from table2 where a=1;

如何使用命令过滤表名cat SQL.txt|grep

我的预期输出是:

table1
table2

我是指挥新手grep,感谢您的帮助。谢谢。

更新

我想要的是知道如何将正则表达式应用到grep命令中。

对于这种情况,我可以编写正则表达式:from (.*?)。问题是我不知道如何将正则表达式与 grep 一起使用

答案1

Grep 只是将模式和文件作为参数。正如中所解释的man grep

GREP(1)                          User Commands                         GREP(1)

NAME
       grep, egrep, fgrep - print lines that match patterns

SYNOPSIS
       grep [OPTION...] PATTERNS [FILE...]
       grep [OPTION...] -e PATTERNS ... [FILE...]
       grep [OPTION...] -f PATTERN_FILE ... [FILE...]

DESCRIPTION
       grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.

所以,一般格式是grep 'regex' file.因此,要使用示例正则表达式,您可以执行以下操作:

grep 'from (.*?)' file 

但这是行不通的,因为grep使用基本正则表达式(BRE) 不将括号视为特殊字符1并且不理解非贪婪(查找最短匹配)*?运算符。你真正想要的是:

grep 'from [^[:blank:]]' file 

它使用 BRE 字符类[[:blank:]],但是否定它与^( [^[:blank:]]) 一起使用,以便它现在匹配任何非空白字符。然而,这仍然不是您所需要的,因为grep将返回整个匹配线而不仅仅是匹配的那一行的部分。

如果您有 GNU grep(Linux 上的默认设置),您可以-o选择grep仅返回匹配部分:

$ grep -o 'from [^[:blank:]]*' file 
from table1;
from table2

当然,这仍然不是您所需要的,其中有一个额外的from、一个空格和一个尾随。;再说一次,如果你有 GNU grep,你可以使用 PCRE(Perl 兼容正则表达式),它支持环顾四周

$ grep -oP '(?<=from )\w+' file 
table1
table2

此处,-o指示grep仅返回匹配部分并-P启用 PCRE 支持。这(?<=from )被称为积极的后视表示“如果前一部分匹配,则仅匹配下一部分from”。最后,\w是一个特殊的 PCRE 类,它匹配“单词字符”:字母、数字和_(如果使用 Unicode,还可以更多)。正如中所解释的man perlre

\w        [3]  Match a "word" character (alphanumeric plus "_", plus
               other connector punctuation chars plus Unicode
               marks)

PCRE 也有一个很棒的\K功能。这就像回顾,但基本上意味着“忽略与此处匹配的任何内容”。使用它,我们可以将上面的正则表达式简化为:

$ grep -oP 'from \K\w+' file 
table1
table2

答案2

尝试使用没有管道的 AWK 命令,经过测试并且工作正常

 awk '{for(i=1;i<=NF;i++){if($i ~ /^table/){gsub(";","",$i);print $i}}}' file

输出

table1
table2

相关内容