正規表現で複数行のログを抽出しようとしています。
ところでログファイルが大きすぎて大変ですね。 (約10GB)..
いろいろな方法を試してみましたが、目的の結果が得られませんでした。
最初の試み)
1)「崇高なアプリ」で正規表現を使用します。 =>問題:メモリ不足が表示されます。
2)「スーパー編集アプリ」で正規表現を使用してください。 =>問題:メモリ不足が表示されます。
2回目の試み)osxの端末で「sed」プログラムを使用します。
使用される操作)
$sed -E -n '/.*output:[\S\s]*?AAA[\S\s]*?END.*/p' ./AppLog.txt
AAAがキーワードを検索しています。 (ユーザーID)
「REエラー:無効な冗長演算子オペランド」と表示されます。
AppLog.txtの内容です。
:
:
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_TEL = {"001-1234-1234"}
:
05 USER_LOCATION = {"earth"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"BBB"} <= searching key
01 USER_NAME = {"N"}
:
03 USER_LOCATION = {"saturn"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_ADDR = {"bla~ bla~~"}
:
010 JOB = {"designer"}
[END]
=============================================
:
:
必要な結果は次のとおりです。
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_TEL = {"001-1234-1234"}
:
05 USER_LOCATION = {"earth"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_ADDR = {"bla~ bla~~"}
:
010 JOB = {"designer"}
[END]
=============================================
答え1
pcregrep
働く:
pcregrep -M \
'DEBUG.*output:\n===*\n.*?\n.*?USER_ID.*?"AAA".*?(\n*?.*?\n*)*?===*' AppLog.txt
答え2
AWK--
awk -v RS='[\\=]+[\\=]' -v FS='\n' '/{"AAA"}/{ printf "%s%s%s%s",prevline,RT, $0, RT }{prevline="\n"$(NF-1)"\n"$NF}' ./AppLog.txt
レコードは ====== で区切られます。
最後の 2 行は prevline に保存されます。
以前に保存された値、区切り記号、現在の値、区切り文字を再印刷します。
答え3
awkはより速いツールかもしれません。この[END]
行を次のように使用します。右エココードS分割ツール:
awk -vRS='\\[END\\]' -vORS='[END]\n' '/\"AAA\"/' infile |
awk '/output:$/,/\[END\]/'
最初の行を選択右含まれている記録"AAA"
。
2行目は出力をoutput:
との間の行に制限します[END]
。
答え4
彫刻の場合:
FILE=${1-data1}
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Results:"
cgrep -d "/////" -w "DEBUG" +w "END" "AAA" $FILE
これは次のように生成されます。
Results:
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_TEL = {"001-1234-1234"}
:
05 USER_LOCATION = {"earth"}
[END]
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_ADDR = {"bla~ bla~~"}
:
010 JOB = {"designer"}
[END]
パスワード正規表現テキストの周りにウィンドウを指定できます(AAA)検索。したがって、この場合は再び次に戻ります。デバッグ、そして次のアドレスに渡されます:終わり。
私たちはATTコードを使用しました正規表現数年間。コンパイルが必要ですが、プロセス中にエラーは発生しませんでした。
以下はいくつかの詳細です。正規表現:
cgrep shows context of matching patterns found in files (man)
Path : ~/executable/cgrep
Version : 8.15
Type : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Home : http://sourceforge.net/projects/cgrep/ (doc)
頑張って...乾杯、drl