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、スペース、末尾の;が 1 つあります。もう一度言いますが、GNU をお持ちの場合はgrep、PCRE (Perl 互換正規表現) を使用できます。これは、ルックアラウンド:

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

ここで、は一致する部分のみを返すように-o指示し、はPCREサポートを有効にします。はgrep-P(?<=from )肯定的な後見および は、「前の部分が に一致する場合にのみ次の部分に一致するfrom」ことを意味します。最後に、 は「単語文字」、つまり文字、数字、および (Unicode を使用している場合は、さらにもう少し) に\w一致する特別な PCRE クラスです。 で説明されているように、_man perlre

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

PCRE には気の利いた\K機能もあります。これは lookbehind に似ていますが、基本的には「ここまで一致したものはすべて無視する」という意味です。これを使用すると、上記の正規表現を次のように簡略化できます。

$ 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

関連情報