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