2017-01-12 4 views
1

ファイルシステムにファイルがあります。私はbashスクリプトでそのファイルを読んでいます。ファイル形式が違う。ファイルから選択した値だけを読みたい。私はファイルが非常に巨大であるので、ファイル全体を読んでみたくない。以下は私のファイル形式です:Bashスクリプトでファイルを読む

Name=TEST 
Add=TEST 
LOC=TEST 

ファイルには上記のようなデータがあります。それから私は変数に日付を追加するだけです。どうすればいいのか教えてください。

file="data.txt" 
while IFS= read line 
do 
    # display $line or do somthing with $line 
    echo "$line" 
done < "$file" 

答えて

4

は、物事をスピードアップするために、この場合はAwkを仕事のために意味の適切なツールを使用します。今私は、ファイルを読むためにこれをやっているのよう

dateValue="$(awk -F"=" '$1=="Add"{print $2; exit}' file)" 
printf "%s\n" "dateValue" 
TEST 

デリミタとして入力行を=で分割するのがアイデアです。 awkロジックは、フィールドをチェックして動作し、Addに対応する対応する値を出力します。

exit部分は印刷後オプションです。 Add文字列が満たされるとすぐに処理を終了します。あなたが指定したようにファイルが巨大であれば、迅速な処理に役立ちます。

+0

「exit」は本当にオプションですか? – codeforester

+1

@codeforester: 'optional'のように、' Add 'に似た '$ 1'の値がない限り、コマンドは引き続き動作します。しかし、それが存在しない場合には、コマンドは大きなファイルで実行するには時間がかかりますが、それにもかかわらず実行されます。 – Inian

2

あなたは、あなたのラインを得た後breakに気づく、あなたのループをこのように書き換えることができます:

while IFS='=' read -r key value; do 
    if [[ $value == "Add" ]]; then 
    # your logic 
    break 
    fi 
done < "$file" 

あなたの意図は、単に「=追加」の非常に最初の発生を取得する場合、あなたはgrepを使用することができますこの方法で:

value=$(grep -m 1 '^Add=' "$file" | cut -f2 -d=) 
+0

あなたは 'bash'であなたの返答を気に入っていますが、実際にはパフォーマンスを考慮して処理するツールではありません。http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-これについての詳細な説明をするためには、 – Inian

関連する問題