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
完全一致が返されるので、これはまだ必要ではありません。ワイヤー一致する線の部分だけではありません。
grep
GNU(Linuxのデフォルト)がある場合は、一致する部分のみを返すように-o
選択できます。grep
$ grep -o 'from [^[:blank:]]*' file
from table1;
from table2
もちろん、これはまだ必要なものではありません。追加from
、スペース、末尾があります。;
繰り返しますが、GNUがある場合は、grep
以下をサポートするPCRE(Perl Compatible Regular Expressions)を使用できます。周りを見てください:
$ 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
機能もあります。これは振り返るのと似ていますが、基本的には「ここに一致するものを無視します」という意味です。これを使用して、上記の正規表現を次のように単純化できます。
$ 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