2017-12-26 52 views
1

私はSQLログを使ってたくさんのファイルを持っています。私は次のパターンのすべての出現を抽出するために外を見てい文字列の抽出とダッシュフィルタリングMac OS X

SQLログは、私がlogs_で始まるファイルをスキャンして、その後、すべてのユニークなテーブルを抽出したいこの

sel * 
from DB.T1; 
update DB.T1; 
delete from DB.T2; 
collect stats on 
DB.T3 index (a,b,c); 
sel count(*) from Db.T1; 
sel count(*) from db . T2; 
sel count(*) from db.t2; 

ようになりますSQLを持っていますDB./db./Db./dBという文字列で指定します。 あなたは、私が期待していた出力は、T2 T1重複排除リストである少数の例では、DBの後に空白があるT3

を見ることができるように、私は、Mac OS Xの

によこれは私が得ることができたものです。私はこれを越えることができませんでした

grep -o -i 'tb.*\Z' *logs_* | uniq 

これは空の結果です。私は文字列の最後まで(そして行末ではなく)望むように\ Zを使用していました。

正しいコマンドを作成するのに助けが必要です。以下のような

答えて

0

何か:Z \

grep -E -o -i 'DB ?\. ?[A-Z0-9$_]+' | cut -d . -f 2 | tr -d ' ' | sort -u 

は、私の知る限り、グレップによってサポートされていません。それをサポートする言語では、実際には文字列の最後までであり、文字列の最後の単語ではありません。したがって、grep内のテーブル名を明示的に一致させる必要があります。

-eを使用してgrepの拡張正規表現を使用すると、+?が正規表現メタキャラクタとして認識されます。これは絶対に必要なわけではありません。あなたは-Eから離れて、代わりに\+\?を使用することができます。

正規表現DB ?\. ?[A-Z0-9$_]+(またはDB \?\. \?[A-Z0-9$_]\+あなたは-Eフラグをオフのままにした場合は)一致します。

the literal characters "DB" (case insensitively, because of -i) 
an optional space 
a literal "." 
an optional space 
one or more of any ascii letters, digits, $ or _ (the characters that can appear in an unquoted mysql table name) 

カットは、データベース名を削除し、trは、テーブル名の前にスペースを削除し、並べ替えだけ返し-u一意のテーブル名。 (uniq自身ではこれを行いません;前の行と重複している行だけが削除されるので、最初にソートした場合は何もしませんでした)

+0

ありがとうございます。 。これを実行すると、パターンに一致しないいくつかの行が表示されます。select *のような完全な行がDB.T1から取得されています。 – pmv

+0

@pmv '-o'を省略しましたか?あなたがここで試したものを正確に表示してください。 – ysth

+0

こんにちは。ありがとう。 -EとDBの部分の理解を助けてくれますか? ?[A-Z0-9 $ _] + ' – pmv