2017-01-24 9 views
2

私はこのシェルスクリプト変数varを持っています。 3つのエントリをの新しい行で区切って保持します。この変数VARから、私は、および0.078688を抽出したいです。ちょうどこれらの2つの数字。上記の作業のシェルスクリプト変数からデリミタ間のデータを抽出

echo "$var" | grep -o -P '(?<=\=).*(?=\n)' # For extracting 2 

echo "$var" | awk -v FS="(# |\n)" '{print $2}' # For extracting 0.078688 

なし:

var="USER_ID=2 
    # 0.078688 
    Suhas" 

これらは私が試したコードです。ここでの問題は何ですか?これを修正するには? AWKで

答えて

2
echo "$var" |grep -oP 'USER_ID=\K.*' 
2 
echo "$var" |grep -oP '# \K.*' 
0.078688 

あなたの解決策が近くにあり、あなたが表す$にチャンス\nに必要行末。

あなたは正規表現を使用して、純粋なbashのでそれを行うことができます
echo "$var" |awk -F'# ' '/#/{print $2}' 
0.078688 
echo "$var" |awk -F'=' '/USER_ID/{print $2}' 
2 
0

まず値:

echo "$var" | grep 'USER_ID' | awk -F "=" '{print $2}' 

2番目の値:

echo "$var" | grep '#' | awk '{print $2}' 
+0

youâのようにデータの形式であると仮定。その複数行のデータ。 –

+1

あなたの試行を気に入ってください。しかし、OPには単語間に改行文字があるため、これはうまくいきません。そしてあなたの例は、OPが質問に矛盾する見積もりをしていない場合にのみ動作します。 – Inian

+1

@ ZumodeVidrio:「意図的に "var"を引用していないと言ったとき、それは間違っています。 "bash"で引用符で囲まれていない変数を扱うことは正しくありません([Word Splitting]と呼ばれる) http://mywiki.wooledge.org/WordSplitting)。これは実際に_as-is_という文字列を保持しており、引用符で囲まれていないもので作業することは特権ではありません! – Inian

1

#!/bin/bash 

var="USER_ID=2 
# 0.078688 
Suhas" 

[[ ${var} =~ =([0-9]+).*#[[:space:]]([0-9\.]+) ]] && result1="${BASH_REMATCH[1]}" && result2="${BASH_REMATCH[2]}" 
echo "${result1}" 
echo "${result2}" 
+0

'++'は_other-tools_と 'shell'ユーティリティを使用しないためです。 – Inian

5

だけ桁の数字、ドット(.)とホワイトスペースを保持するためだけではtrを使用し、他のすべてを削除します。

manページから

tr -cd '0-9. ' <<<"$var" 
2  0.078688 
-c-dフラグの使用のための trの、

TR [OPTION] ... SET1 [SET2]

-c、-C、 - -compleplement SET1の補数を使用

-d、--delete SET1の文字を削除します。翻訳しません。

変数に格納し、

IFS=' ' read -ra numArray < <(tr -cd '0-9. ' <<<"$var") 
printf "%s\n" "${numArray[@]}" 
2 
0.078688 

として

IFS=' ' read -r var1 var2 < <(tr -cd '0-9. ' <<<"$var") 
printf "%s\n" "$var1" 
2 
printf "%s\n" "$var2" 
2 
0.078688 

ORアレイにおける注: - tr-cdフラグがPOSIXに準拠しており、持っている任意のシステム上で動作しますtrがインストールされています。

+1

'++'はすごいですから! :) – OscarAkaElvis

0

`正しいデータを取得するために`エコーの「$ VAR」を行う、これは間違った入力データを取って再あなたのサンプル

# For extracting 2 
echo "$var" | sed -e '/.*=/!d' -e 's///' 
echo "$var" | awk -F '=' 'NR==1{ print $2}' 

# For extracting 0.078688 
echo "$var" | sed -e '/.*#[[:blank:]]*/!d' -e 's///' 
echo "$var" | awk -F '#' 'NR==2{ print $2}' 
関連する問題