2017-12-31 215 views
1

バックエンドの一部としてnmapを使って小さなネットワークスキャン自動化ツールを作成しています。ホスト名とIPアドレスを取得しようとすると、IPは "(192.168.0.1) "現在、私はホスト名とIPを取得して印刷するためにこのコードを使用しています。Bash:awkは配列の項目からカッコを削除する

devices=($(nmap $net_addr -sn | grep -E '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})' | awk {' print $5 "\t" $6)'})) 

printf '%-10s %s\n' "${devices[@]}" 

このコードは、nmapのIPアドレスの長さがこのdoesnの可変であるように私はSUBSTR($ 6,2)を使用しようとしましたが、これだけチョップ最初のビットをオフし、悲しいことに、この

UNKNOWN (192.168.0.1) 
UNKNOWN (192.168.0.3) 
UNKNOWN (192.168.0.5) 
UNKNOWN (192.168.0.6) 
UNKNOWN (192.168.0.16) 
UNKNOWN (192.168.0.18) 
UNKNOWN (192.168.0.19) 
UNKNOWN (192.168.0.21) 
UNKNOWN (192.168.0.22) 
UNKNOWN (192.168.0.23) 
UNKNOWN (192.168.0.32) 
UNKNOWN (192.168.0.253) 

を印刷します私を助けてはいけない。要するに、これは望ましい出力です。ここ

UNKNOWN 192.168.0.1 
UNKNOWN 192.168.0.3 
UNKNOWN 192.168.0.5 
UNKNOWN 192.168.0.6 
UNKNOWN 192.168.0.16 
UNKNOWN 192.168.0.18 
UNKNOWN 192.168.0.19 
UNKNOWN 192.168.0.21 
UNKNOWN 192.168.0.22 
UNKNOWN 192.168.0.23 
UNKNOWN 192.168.0.32 
UNKNOWN 192.168.0.253 

は、nmapのあなたが示した予想出力を得るために、単一のawkを、次の試みることができるあなたの示す入力を1として192.168.0.0/24 -sn

Starting Nmap 7.40 (https://nmap.org) at 2017-12-31 14:42 UTC 
Nmap scan report for UNKNOWN (192.168.0.1) 
Host is up (0.0014s latency). 
Nmap scan report for UNKNOWN (192.168.0.3) 
Host is up (0.052s latency). 
Nmap scan report for UNKNOWN (192.168.0.5) 
Host is up (0.0065s latency). 
Nmap scan report for UNKNOWN (192.168.0.6) 
Host is up (0.0073s latency). 
Nmap scan report for UNKNOWN (192.168.0.7) 
Host is up (0.029s latency). 
Nmap scan report for UNKNOWN (192.168.0.16) 
Host is up (0.011s latency). 
Nmap scan report for UNKNOWN (192.168.0.18) 
Host is up (0.053s latency). 
Nmap scan report for UNKNOWN (192.168.0.21) 
Host is up (0.011s latency). 
Nmap scan report for UNKNOWN (192.168.0.22) 
Host is up (0.012s latency). 
Nmap scan report for UNKNOWN (192.168.0.23) 
Host is up (0.0061s latency). 
Nmap scan report for UNKNOWN (192.168.0.32) 
Host is up (0.0013s latency). 
Nmap scan report for UNKNOWN (192.168.0.253) 
Host is up (0.0011s latency). 
Nmap done: 256 IP addresses (12 hosts up) scanned in 3.16 seconds 

答えて

1

の出力です。

your_command | awk '/Nmap scan report/{gsub(/\)|\(/,"",$NF);print $(NF-1),$NF}' 

EDIT: OPのコマンドからgrepを排除し、今単一awk自体の中にそれを解決しようとしています。私awk以来、また

devices=$(nmap $net_addr -sn | awk --re-interval '{if(match($0,/\([0-9]{3}\.[0-9]{3}\.[0-9]{1,3}\.[0-9]{1,3}\)/)){gsub(/\)|\(/,"",$NF);print $(NF-1),$NF}}') 

はあなたが親切に溶液中 --re-intervalを使用していない awkの最新バージョンを持っている場合には古いものです。

+0

がああ[OK]をので、私はちょうどこれを実行しようとしましたsedを試すことができます。デバイス=($(nmapの$ net_addr -sn |グレップの-E「([0-9] {1、 [0-9] {1,3} \。[0-9] {1,3}) '| awk'/Nmapスキャンレポート/ {gsub (NF-1)、$ NF}))))そして、私はこれを次のようにしました:./program.sh:行10:予期しないEOF '' 'を探している間 ./program.sh:行12:構文エラー:予期しないファイルの終わり – user3019354

+0

ちょうど私の問題を実現しました。私は引用符を逃しました、コードは魅力のように動作します! – user3019354

+2

awkは、grepが行うことができる便利なことを実行できるので、awkを使用しているときにはgrepは必要ありません。たとえば、次のようになります。 'grep 'foo' | awk '/ bar /' '=' awk '/ foo/&&/bar /' 'のようになります。 –

1

あなたは、これはあまりにも

nmap $net_addr -sn | sed '/^Nmap scan report for /!d;s///;s/[)(]//g' 
関連する問題