2016-09-10 11 views
0

私はバッチの開始日の下に持って、ラインと呼ばれる変数に格納されている時刻、終了日、終了時刻と状態を開始します。シェルスクリプト - 列の値を読み込んで変数に格納する最も良い方法は?

echo "$line" 
batch1 09/09/2016 15:12:00 09/09/2016 16:00:00 success 

私は様々な変数に各coulmn値を格納する必要があります:batch_name、START_DATE、START_TIME、 end_date、end_time、status。それをやっての

一つの方法は、awkを使用して、しかしcloumnsの数が非常に大きい場合雑然と見えている:

batch_name="$(echo $line|awk '{ print $1}')" 
start_date="$(echo $line|awk '{ print $2}')" 
start_time="$(echo $line|awk '{ print $3}')" 
end_date="$(echo $line|awk '{ print $4}')" 
end_time="$(echo $line|awk '{ print $5}')" 
status="$(echo $line|awk '{ print $6}')" 

もう一つの方法は、ループしながら使用しているが、それは文句を言わない、whileループスポーンので、外ループしながら値を保持しますサブシェル:

echo "$line"|while read batch_name start_date start_time end_date end_time status;do 
echo "" 
done 

PS:
私は多くのバッチの状態を格納するファイルを持っています。私はそれぞれの行を反復処理する必要があるとなどのステータス、終了時間に基づいて、いくつかの処理を実行する必要があります。

cat batch_status.txt 
batch1 09/09/2016 15:12:00 09/09/2016 16:00:00 success 
batch2 08/09/2016 09:00:08 09/09/2016 01:56:12 inprogress 
batch3 08/09/2016 07:15:28 08/09/2016 01:46:22 failure 

私の最後のスクリプトは次のようになります。bashのでは

cat batch_status.txt|while read line;do 
#read LINE and store each column values to corresponding variable (best way to do it?) 
#do processing based on batch_name,start_date,start_time,end_date,end_time,status 
done 
+0

'読み取り中-rバッチ名start_date start_time end_date end_time status;エコー "ここで処理する"; done anubhava

+0

whileループがサブシェルを生成し、変数値がループ中に反映されないので、これはbashでは機能しません – penguin

+0

いいえ、whileループはサブシェルを生成しませんが、パイプラインサブシェルを作成します。 – anubhava

答えて

1

read -r batch_name start_date start_time end_date end_time status <<< "$line" 

あなたはパイプを使用したい場合は、ないサブシェルでwhileを実行するためのbashのオプションlastpipeを有効にします。

line='batch1 09/09/2016 15:12:00 09/09/2016 16:00:00 success' 
shopt -s lastpipe 
echo "$line" | while read batch_name start_date start_time end_date end_time status; do echo $status; done 
関連する問題