2017-05-07 20 views
0

私は、解析するスクリプトを作成したい私のコンピュータに保存されたログファイルを持っています。私の目的は、ログファイルの各行から2つの値を取り出し、同じ行の隣に(おそらくハイフンで区切って)それらを出力し、ログ内の各行について繰り返し処理することです。たとえば、次のログ:2つのbashループ結果値を同じ行に出力しますか?

123-abc-thething01, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 
123-abc-thething02, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 
123-abc-thething03, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 

スクリプトがうまくいけば達成する実行した後...

123-abc-thething01 - [email protected] 
123-abc-thething02 - [email protected] 
123-abc-thething03 - [email protected] 

瞬間、私は正しい値を引いて、次のコードを持っている、しかしそれはあります1行1行にvar1とvar2の値を出力し、次に1行にvar1とvar2を出力し、次に新しい行の2行目のvar2をvar2に出力するのではなく、次のように 'var1'をすべて出力してから 'var2'等

123-abc-thething01 123-abc-thething02 123-abc-thething03 
[email protected] [email protected] [email protected] 

私はこれを行うさまざまな方法を試してみましたが、私はちょっと困惑しています。私は現時点では非常にbashと強くないので、どんな助けも大いに感謝されるでしょう。ありがとう。

#!/bin/bash 

for i in logfile.txt 
do 
    var1=$(cat logfile.txt | awk '{print $1}' | sed 's/,//g') 
    var2=$(cat logfile.txt | grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*') 
done 

echo ${var1} 
echo ${var2} 
+1

あなたはawk 'awk -F、 '{print $ 1" - "$ 6}" file " – 123

+0

だけを使ってテキストファイルを解析するためにシェルスクリプトを使うべきではありません。 /([:alnum:] ._-] + @ [[:alnum:] ._-] +ならばperl 'perl -ne 'は" $ 1 - $ 2 \ n " )/ '' – 123

+0

ありがとう!そう簡単に私はこのアプローチで行くと思います。 – Dronzil

答えて

1

#!/bin/bash 

while IFS="," read -r -a array 
do 
    # remove leading white space from element 5 
    echo "${array[0]} - ${array[5]/# /}" 
done < logfile.txt 

出力:このジョブの

 
123-abc-thething01 - [email protected] 
123-abc-thething02 - [email protected] 
123-abc-thething03 - [email protected] 

可能な場合は使用のawk。

+0

こんにちは、サイラス、これは本当に便利です!私はおそらくthoを言及すべきだった、電子メールアドレスは各ログライン内の任意の位置にすることができ、ちょうど5位(私の悪い)ではない。これが私が正規表現を使いたかった理由ですが、このような状況では何か提案がありますか?ありがとうございました – Dronzil

+0

なぜ、短い、効率的なawkスクリプトをwhileループに変更するのですか? – 123

+0

@Dronzil正規表現と確実にマッチングできる電子メールアドレスの唯一の部分は '@'です。あなたが電子メールの正規表現に入れたものは、有効なアドレスで失敗する可能性があります。これがユーザーが送信する実世界のアドレスを処理している場合は、アドレスがどのフィールドにあるかを追跡する別の方法が本当に必要です。 – ccarton

1

使用awkます。bashで

awk -F', ' '{printf "%s - %s\n", $1, $6}' log.file 
+1

これは$ 6の前に余分なスペースを持っています – 123

+0

公正なポイント。それを変更しました。 – hek2mgl

関連する問題