Bash:IPアドレスと名前が一致する追加の列を印刷する方法

Bash:IPアドレスと名前が一致する追加の列を印刷する方法

netstat接続されているIPに関する情報を収集するために使用します。私は次の形式を持っています:

netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sor t | uniq -c | sort -nr
      5 81.133.113.200
      4 80.229.142.126
      2 94.136.36.29
      2 92.19.231.69
      2 85.159.56.230
      2 83.70.246.152
      2 81.131.118.236
      2 185.106.92.42
      1 92.19.232.88
      1 86.47.113.169
      1 86.168.206.46
      1 79.77.175.210
      1 46.19.141.238
      1 206.221.184.2
      1 192.198.95.6

私が達成したいのは、IPをホスト名と一致させることです。

したがって、どこかに保存し、name=$(IPADDRESSNAME)名前がIPアドレス81.133.113.200と一致する場合

次の形式で印刷したいと思います。

  5 81.133.113.200 - IPADDRESSNAME
  4 80.229.142.126
  2 94.136.36.29
  2 92.19.231.69

これを行うために列を読みましたが、2つの列を住所に一致するものと組み合わせる方法がわかりません。

Bashスクリプトを使用して実行しているので、ここにホスト名を保存します。

私は次のことを考えています:

string=$(netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr)
if [[ $string == "81.133.113.200" ]]
then
  echo "Its XXXXXXXX HOST";
fi

これはうまくいきませんが、ロジックは後ろにありますが、インラインです。

答え1

次のテストバージョンをお試しください。

netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sor t | uniq -c | sort -nr |\
while read index ipaddress ; do \
  printf "%s " "${index}" ;\
  getent hosts "${ipaddress}" ;\
  if [ $? -eq 2 ]; then \
    printf "%s\n" "${ipaddress}" ;\
  fi ;\
done

標準を使用しています得るお問い合わせ所有者指定されたIPアドレスに基づいてホスト名を取得するデータベース。

テストを受ける:

5 81.133.113.200  host81-133-113-200.in-addr.btopenworld.com
4 80.229.142.126  garnerhome.plus.com
2 94.136.36.29    mail.e-trackit.co.uk
2 92.19.231.69    host-92-19-231-69.static.as13285.net
2 85.159.56.230
2 83.70.246.152   83-70-246-152-dynamic.b-ras1.prp.dublin.eircom.net
2 81.131.118.236  host81-131-118-236.range81-131.btcentralplus.com
2 185.106.92.42
1 92.19.232.88    host-92-19-232-88.static.as13285.net
...

答え2

コンテンツを削除するのではなく、Sedを使用して行を追加できることを忘れました。そのため、Sedを使用して文字列を検索し、その後に行を追加します。考えてみるととても簡単です。

列に出力して状況を複雑すぎるようです。

簡単なライナーを例に挙げましょう。

  netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sed '/8.8.8.8/s/$/ Its Google/' | sort | uniq -c | sort -nr

答え3

出力を1行ずつ処理し、要件に応じて印刷できます。 /etc/hosts のアドレスをホスト名にマップすると仮定すると、次のことができます。

get_connected_hosts() {
  netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
}

get_connected_hosts | while read line; do
  set -- $line
  result=$(grep $2 /etc/hosts | head -1 | awk '{ print $2 }')
  # or a reverse DNS lookup, result=$(dig +short -x $2)
  echo "$1 $2 - $result"
done | column -t

答え4

netstat -tn | awk '/:80 / {print $5}' | sed -e 's/:.*//' | 
    xargs -i sh -c 'echo {} $(getent hosts {})' | 
    awk '$1 == $2 {print $2, $3; next}; {print}' | 
    sort | uniq -c | sort -nr

(すべて1行にすることができます。水平スクロールバーを避け、読みやすくするために改行を追加しました。)

これは照会を使用しますxargs -i(暗黙の使用-L 1)。getent hosts今後Run ルックアップで何も返さないと出力は生成されないため、sort | uniq -c必要以上に複雑です。したがって、2番目の操作を実行して、1行に1つのIPアドレスのみを印刷するようにしてください。getentechogetentawk

他の選択肢は、を使用するnslookupか、IPでホスト名の検索をdig -x実行host -iすることですが、これらすべての方法では出力の追加処理が必要です。

最初の行の後は実際には必要ありません。 s関数を使って印刷する前に同じ修正を行うことができますがsed、これがもっと読みやすく理解しやすいと思います。awkawkgsub()$5

関連情報