grepを使用して出力から行を区切ります。

grepを使用して出力から行を区切ります。

grepから行を取得して別のコマンドでソートしようとしています。 grep atmに使用するコマンドは次のとおりです(使用するものと比較して十分ではありませんが、より良いコンテキストを提供します)。

iwlist wlan0 scanning | grep -oE '(ESSID:|Quality=|Encryption Key:).*'

出力は次のとおりです(ただし、マイコンピュータの場所によって変わります)。

Quality=64/70 Signal Level=-49dBm
Encryption key:on
ESSID:"Hringdu_20558"
Quality=61/70 Signal Level=-48 dBm
Encryption key:on
ESSID:"SiminnEBE932"
Quality=30/70 Signal Level=-71 dBm
Encryption key:on
ESSID:"Siminn106C46
Quality=28/70 Signal Level=-83 dBm
Encryption key:on
ESSID:"SiminnECC63F"

他のコマンドを実行するためにこの行だけを使用したいと思います。

$ssid=$(zenity --list --text "Available Networks" --list --column "ESSID" --column "Secure" --column "Signal" "$ESSID" "$ENC" "$Signal");

高速ワイヤレスネットワーク選択のヒントの始まりです。 $ESSID/$ENC/$Signal は前の grep の出力に基づいているため、cut/awk/ に分割した後に grep 出力に対して追加処理を行う必要があり、結果は次の sed になります。

91%
on
Hringdu_20558

(注:64に10を掛けて7で割ってパーセンテージを求めました。64 * 10/7)

スクリプトは、検出された各ESSIDのzenityコマンドにこれらの行を繰り返し適用します。そして、問題を加えると、grep出力がzenityコマンドの逆順であることがわかります。つまり、"Hringdu_20558"が最初に入り、"87%"が最後に入らなければならないという意味です。

つまり、この特定のシナリオでは、どういうわけかgrep出力から3行目を取得して別のコマンドに追加する必要があります。その後、最初の 2 行と最初の行の後の 3 行目を処理します。より多くのライン。

基本的に、上記の出力に基づいて、最終的なzenityコマンドは次のようになります。

$ssid=$(zenity --list --text "Available Networks" --list --column "ESSID" --column "Secure" --column "Signal" "Hringdu_20558" "on" "91%" "SiminnEBE932" "on" "87%" "Siminn106C46" "on" "43%" "SiminnECC63F" "on" "40%");

どうすればいいですか?デフォルトのシェルスクリプトだけで実行できますか?

ベストアンサー1

私はこれで終わります:

ssid=$(iwlist wlan0 scanning |
awk -F: '
BEGIN{ printf "zenity --list --text \"Available Networks\" --list --column ESSID --column Secure --column Signal "; }
/Quality/{ split($0,x,"="); Quality = int(x[2]*100/70+.5); }
/Encryption/{ Encryption = $2; }
/ESSID/{ ESSID = $2;
         printf "%s \"%s\" \"%s%%\" ", ESSID, Encryption, Quality
}' |
sh)

実際にはgrepを使用しませんが、必要なことを行います。

おすすめ記事