2012-03-15 10 views
0

bashスクリプトで、コマンドの出力(私の場合はiwconfig)からいくつかのデータフィールドを抽出しようとしています。bashを使用してコマンドの出力からデータフィールドを抽出する

収集した値でcsvファイルを作成したいと思います。 Like:

Timestamp,BitRate,LinkQuality,SignalLevel,Missed beacon,... 
1,270 Mb/s,100/100,-51 dBm,0,... 
2,300 Mb/s,90/100,-43 dBm,0,... 

フィールドは、iwconfigの出力で2つのスペースで区切られています。 IFS変数を2つのスペースに設定できれば、私の問題は解決されます。しかし、私はこれが動作するかどうかはわかりません。 これを行うには何を使用しますか?こんにちは、またはsed?

お問い合わせ

+0

sedは仕事をするように聞こえます(文字列内のスペースには複雑なエスケープルールがないものとします)。 –

+0

sedが良いです。 -d = DELIMには1つの区切り文字が必要なため、2つの空白が余分なフィールドのように見えるので、cutはうまくいかないかもしれません。あなたは入力を投稿できますか? – octopusgrabbus

+0

入力例を示してください。しかし、awkのデフォルトのフィールド区切り文字は "空白"なので、それはちょうど2スペースの問題ではありません。 –

答えて

0

私はこの仕事ができると思う:

s=$(iwconfig $Interface) 
    s=${s//  /} 
    s=${s// /,} 
    OIFS="$IFS" 
    IFS=',' 
    arrIN=(${s// /,}) 
    IFS=$OIFS 

    for value in "${arrIN[@]}"; do 
    echo Value: $value 
    done 

私はこの出力を得る:

Value: wlan0 
Value: 
Value: IEEE 802.11abgn 
Value: ESSID:"Top Gear" 
Value: 
Value: Mode:Managed 
Value: Frequency:2.452 GHz 
Value: Access Point: F8:D1:11:71:56:B6 
Value: 
Value: Bit Rate=1 Mb/s 
Value: Tx-Power=15 dBm 
Value: 
Value: Retry 
Value: long limit:7 
Value: RTS thr:off 
Value: Fragment thr:off 
Value: Encryption key:off 
Value: Power Management:off 
Value: Link Quality=49/70 
Value: Signal level=-61 dBm 
Value: 
Value: Rx invalid nwid:0 
Value: Rx invalid crypt:0 
Value: Rx invalid frag:0 
Value: Tx excessive retries:0 
Value: Invalid misc:0 
Value: Missed beacon:0 

ここでは、たとえば、

${arrIN[6]#*":"} 
1

あなたの質問にお答えします:私はawkを使用します。しかし、おそらく私はPythonと単一の正規表現を使用して、辞書のすべてのパラメータを取得します。出力の

SLEEP=10 # time to sleep between samples 

while true; do # or launch it as a cron task 
    TIMESTAMP=$(date +'%s') 
    IW=$(iwconfig wlan0) 

    # capture each parameter in a variable 
    IEEE=$(echo "$IW" | grep -oP '(?<=IEEE).[^\s]*') 
    ESSID=$(echo "$IW" | grep -oP '(?<=ESSID:).[^\s]*') 
    BITRATE=$(echo "$IW" | grep -oP '(?<=Bit Rate=)\d+\s.[^\s]+(?=[\s]+Tx)') 
    TXPOWER=$(echo "$IW" | grep -oP '(?<=Tx-Power=)\d+\s.*') 
    RLL=$(echo "$IW" | grep -oP '(?<=limit:)\d') 
    RTSTHR=$(echo "$IW" | grep -oP '(?<=RTS thr:).+(?=[ ]+Fra)') 
    FRAGTHR=$(echo "$IW" | grep -oP '(?<=Fragment thr:).+') 
    TXPOWER=$(echo "$IW" | grep -oP '(?<=Tx-Power=)\d+ .*') 
    PM=$(echo "$IW" | grep -oP '(?<=Management:).*') 
    LQ=$(echo "$IW" | grep -oP '(?<=Quality=)\d+/\d+') 
    SIGLEV=$(echo "$IW" | grep -oP '(?<=level=).*') 
    RXNWID=$(echo "$IW" | grep -oP '(?<=nwid:)\d+') 
    RXCRYPT=$(echo "$IW" | grep -oP '(?<=crypt:)\d+') 
    RXFRAG=$(echo "$IW" | grep -oP '(?<=frag:)\d+') 
    RTERET=$(echo "$IW" | grep -oP '(?<=retries:)\d+') 
    RTIMISC=$(echo "$IW" | grep -oP '(?<=misc:)\d+') 
    RTMBEAC=$(echo "$IW" | grep -oP '(?<=beacon:)\d+') 

    #line 
    echo $TIMESTAMP,$BITRATE,$LQ,$SIGLEV,$RTMBEAC,... 
    sleep $SLEEP 
done 

例:

ボーナス:あなたがGNUのgrepのを(あなたはiwconfigの出力として変化し得る必要があります正規表現は、デバイスに依存している)を使用して、bashで欲しいものを私がやっての練習を行ってきました:

1331848207,54 Mb/s,70/70,-37 dBm ,0,... 
1331848217,54 Mb/s,70/70,-35 dBm ,0,... 
1331848227,54 Mb/s,70/70,-34 dBm ,0,... 
1331848237,54 Mb/s,70/70,-39 dBm ,0,... 
1331848247,54 Mb/s,70/70,-35 dBm ,0,... 
1331848257,54 Mb/s,70/70,-37 dBm ,0,... 
+0

私はiwconfigの出力がデバイスに依存しているかどうかわかりませんでした。ヒントありがとう! 私は以前に説明したはずです:スクリプトは組み込みLinuxシステム(Gumstix)で実行され、grepはその都度変数を完全に読み込むと思います。 私はフィールドがどこにあるのか知っているので、配列を使うことを考えました。だから私は出力単語を1つの配列に読み込んで、変数の内容全体を何度も何度も読むことなく、特定のフィールドに直接アクセスすることができます。 – Powderking

関連する問題