SQLコマンドの長いログファイルがあり、テーブル名を特定することに興味があります。たとえば、
SELECT * FROM table_02323
SELECT * FROM table_231
SELECT * FROM table_1
結果が返されるようにgrepしたいと思います。
table_02323
table_231
table_1
私が得た最も近いものでしたが、grep -o 'table.....' this.log
明らかにサフィックスの長さは異なります。ピリオドのように固定長に制限されずに出力できる正規表現はありますか?
答え1
これは、「table_」の後にゼロ個以上のASCII番号が続くものと一致します。
grep -o 'table_[0-9]*' this.log
答え2
次のようにGNUを使用してくださいgrep
。
grep -oiP 'FROM\s*\K\w+' infile
非GNU:
grep -ioP 'FROM[ ]*\K[A-Z_0-9]+' infile
これにより、テーブル名のみを取得できます。
テスト:
grep -ioP 'FROM\s*\K\w+' <<<"SELECT * FROM table_02323 where 1=1"
table_02323
答え3
からman grep
:
Repetition A regular expression may be followed by one of several repetition operators: ... * The preceding item will be matched zero or more times.
だから、次のようなものを使いたい
$ grep -o 'table\w*'
\w
空白以外の文字は0回以上繰り返されます。
答え4
別の方法は、LookBehindを使用することです。
$ grep -P -o -e '(?<=^SELECT \* FROM )(.*$)' < 'file'
table_02323
table_231
table_1