grepを実行し、単語全体を出力します。

grepを実行し、単語全体を出力します。

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

関連情報