sedで検索した複数の文字列だけを印刷できますか?

sedで検索した複数の文字列だけを印刷できますか?

正規表現で複数行のログを抽出しようとしています。

ところでログファイルが大きすぎて大変ですね。 (約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
  1. レコードは ====== で区切られます。

  2. 最後の 2 行は prevline に保存されます。

  3. 以前に保存された値、区切り記号、現在の値、区切り文字を再印刷します。

答え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

関連情報