Awk

如何使用 grep 通過正則表達式提取字元串?

  • March 14, 2020

說我有一個 SQL.txt

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

如何使用命令過濾表名cat SQL.txt|grep

我的預期輸出是:

table1
table2

我是新手grep指揮,我很感激任何幫助。謝謝。

更新

我想要的是知道如何將正則表達式應用到grep命令中。

對於這種情況,我可以編寫正則表達式:from (.*?)。問題是我不知道如何將正則表達式與 grep 一起使用

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)

PCREs 也有漂亮的\K特性。這就像向後看,但基本上意味著“忽略與此處匹配的任何內容”。使用它,我們可以將上面的正則表達式簡化為:

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

引用自:https://unix.stackexchange.com/questions/572485