Awkコマンド - 2つのコマンドの組み合わせ

Awkコマンド - 2つのコマンドの組み合わせ

私は私が書いているbashスクリプトで変数を操作する方法を学ぶ過程でゆっくりと道を探しています。 iftopからソースとターゲットを抽出するためにAWK(Grepを試しましたが十分ではないようです)を使用しようとしています。

私が使用するデフォルトのiftopコマンドは次のとおりです。

sudo iftop -t -L1 -s1 -f "dst host 10.0.0"

逆の結果を得るために、dstをsrcに切り替えることができます。したがって、上記のコマンドの出力例は次のようになります。

interface: eth0
IP address is: 10.0.0.104
MAC address is: b8:27:eb:6a:26:84
Listening on eth0
   # Host name (port/service if enabled)            last 2s   last 10s  last 40s cumulative
--------------------------------------------------------------------------------------------
   1 10.0.0.255                               =>         0b         0b         0b         0B
     10.0.0.15                                <=     1.14Kb     1.14Kb     1.14Kb       291B
--------------------------------------------------------------------------------------------
Total send rate:                                       480b       480b       480b
Total receive rate:                                  1.29Kb     1.29Kb     1.29Kb
Total send and receive rate:                         1.76Kb     1.76Kb     1.76Kb
--------------------------------------------------------------------------------------------
Peak rate (sent/received/total):                       480b     1.29Kb     1.76Kb
Cumulative (sent/received/total):                      120B       331B       451B
============================================================================================

私はAWKを使用して2つのIPアドレス(またはドメイン)をbashでいくつかの操作を実行できる変数として出力したいと思います。

次のコマンドを使用する場合:

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 / {print $2}'

これにより、最初のIPまたはドメインが提供されますが、2番目の行が必要になります。私は次のようなものを試しました。

 sudo iftop -t -L1 -s1 -f "dst host 10.0.0" 2> /dev/null | awk '/^   1 /{c=2} c&&c-- {print $2}'

これはほとんど機能しますが、2行目の白い間隔のため、AWKは最初の行の列2を2行目の列1として計算するので、私が得る出力は次のようになります.

10.0.0.255
<=

近づいているような気がしますが、単一のAWKコマンドを使用して正しい2つの数字を吐き出す方法がわかりません。

IPやドメインの前にスペースが足りないため、2番目の数字の2番目のパターンを比較するのは簡単ではなく、理想的には1番目の数字を一致させてから次の行に進みたいのですが、2番目の列の代わりに1番目の列です。

また、結果が最初のコマンドと異なる可能性があるため、2番目のiftopコマンドを実行しないようにしたいと思います。

次に、画面に印刷するのではなく、bashスクリプトの変数に変換する方法を知る必要があります。

どんなアイデアがありますか?

ベストアンサー1

努力する

 ... | awk '$1 == "1" {print $2 ; l=NR+1 ; } NR == l { print $1 ;}'

どこ

  • $1 == "1" 最初のフィールドが1の行を選択します。
  • {print $2 その価値を印刷する
  • l=NR+1 ; }次の行を覚えて
  • NR == l2行目の選択
  • { print $1 ;}最初のフィールドを印刷

awkは列を考慮せずにフィールドのみを考慮することを覚えておいてください。

これらの2行は、次を使用するのと同じです。$1 $2

 hello world
       hello              world

varに割り当てられた

... | awk '$1 == "1" {printf "A=%s\n",$2 ; l=NR+1 ; } NR == l { printf "B=%s\n",$1 ;}' > /tmp/.var
. /tmp/.var

最後の行はドット(.)、スペース()、および/tmp/.var

  • awkのprintfには、パラメータの後にコンマが必要です。

おすすめ記事