3

Pythonスクリプトで2つの短いUNIXコマンドを使用して、近くのワイヤレスアクセスポイントに関するデータを取得しています。

  • n°1、アクセスポイントのESSIDを取得します。

"iwlist NIC scan | grep ESSID | awk '{print $1}'"

  • n°2、アクセスポイントの信号強度を取得します。

"iwlist NIC scan | grep level | awk '{print $3}'"

私の問題は、これら2つのコマンドを次々に使用することです。つまり、「対称」データが生成されません。6つのESSIDと4つの信号強度データを取得する場合があります。

初めて、スクリプトは6つのAP(A、B、C、D、E、およびF)を検出し、次回は4つのAP(A、C、E、およびF)のみを検出したためです。

私の質問のいくつかは次のとおりです:

  • 最初の結果を「分割」してから、 iwlist NIC scan2つの異なるシーケンスを同じ入力に適用する方法はgrepありますか?awk

少なくとも結果の対称的なリストを取得するためです。

前もって感謝します !

4

3 に答える 3

10

awkとして使用するのはどうですかgrep

iwlist NIC scan | awk '/ESSID/ {print $1} /level/ {print $3}'

これにより、ESSIDとレベルラインが同時に表示されます。おそらくもう少し洗練されていて、少なくとも線にそれが表すものでタグを付けたいと思うでしょう。オプションは軍団です。コードから出力をどのように使用するかが明確ではないため、出力をどのように表示するのが最適かを推測するつもりはありません(ただし、同じ行のネットワークIDとレベルは素晴らしい出力になります—そしてそれは実行可能です)。

于 2012-09-23T00:33:40.040 に答える
4

一般に、このタイプのルーティングはtee、プロセス置換を使用して実行できます。

iwlist NIC scan | tee >( grep -i ESSID | awk '{print $1}' ) | grep -i level | awk '{print $3}'

しかし、これはいくつかの理由でこの状況では劣っています:

  1. grepawkフィルタリング自体を行うことができるので、不要です
  2. awkJonathan Lefflerが指摘しているように、2つのブランチは1つのコマンドに折りたたむのに十分似ています。
  3. 2つの出力ストリームは非決定的な方法でマージされるため、どのレベルがどのESSIDに対応するかを判断するのは困難または不可能な場合があります。各ブランチの出力をファイルに保存し、後でそれらを1行ずつ照合すると便利ですが、これはasgsのソリューションよりもはるかに優れているわけではありません。

ただし、明示的な一時ファイルを使用せずに1つのコマンドの出力を2つの異なるパイプラインに渡す手法は、他の場所で役立つ場合があります。この答えは単なるデモンストレーションだと考えてください。

于 2012-09-23T13:09:10.807 に答える
1
#!/bin/bash
iwlist <NIC> scan > tmpfile
grep -i ESSID tmpfile | awk '{print $1}'
grep -i level tmpfile | awk '{print $3}'
rm tmpfile

このようなスクリプトは、期待どおりの動作をする可能性があります。

于 2012-09-23T00:14:31.207 に答える