2016-05-27 16 views
-1

このような質問は何度か答えられたことは知っていますが、私のケースは少し複雑です。私はこれを含む入力ファイルを持っています:Bash:文字列一致でファイルから複数の配列を埋め込む

blabla bla 
TimeGenerated 13:13:13 
some text 
some more text 
AccountName Joe 
bla bla 
ObjectName d:\dir\ 
AccessType 0x444 
bla text 
blabla bla 
TimeGenerated 13:13:15 
some text 
... 

など、同様のパターンを繰り返します。私の仕事はAccountNames、ObjectNames、AccessTypes変数を3つの配列に集めることです。ユーザー[]、オブジェクト[]、型[]。私は無関係な行を気にする必要はありません。ソリューションはエレガントで高速でなければなりません。最初に私は何かを試してみると思った。

while read line;do 
if [[ "$line" == 'AccountName*' ]] ... then put that into array... 
if [[ "$line" == 'ObjectName*' ]] ... then put that into array... 

しかし、私はあまりにも醜いと思う。はるかに良い方法がなければならない。私はいくつかの稲妻について考えていた。

awk '/AccountName/ {print $2}' logfile .... 
    ... 

しかし、私はどのようにこの出力を効率的に使うのか考えていない。 さらにの場合は、ログファイルに予期しない矛盾が含まれていることを確認する必要があります。 AccountNameとAccessTypeの間から何らかのObjectName行が消えてしまったり、値が抜けていたりすると、関連する配列要素は静的な文字列を取得します。 "エラー"。

+1

これらのbashアレイで何を行う予定ですか? awkですべてを行い、これらの値をさらに処理する必要があるかどうかによって、bashを完全にスキップする方が簡単かもしれません。また、処理する必要がある特定のケース(予期しない欠損値)についても言及します。サンプル入力にそのようなケースを含めることが重要です。 – jas

+0

コメントありがとうございます!配列の目的は、ユーザーごとにいくつかの困難な統計を生成することです。そのため、これらの配列が必要です。 – zulumare

答えて

1
/AccountName/ { count++; user[count] = $2; object[count] = "error"; type[count] = "error" } 
/ObjectName/ { object[count] = $2 } 
/AccessType/ { type[count] = $2 } 

END { 
    for (i = 1; i <= count; i++) { 
     print user[i], object[i], type[i]; 
    } 
} 
+0

パーフェクト。私はこの種のENDをawkで認識していませんでした。ありがとう。 – zulumare

関連する問題