如何使用 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

相關內容