2016-09-29 6 views
1

で計算された列を追加します。は、私はちょうどコマンドでそれらのフィールドでリストを取得したいコマンド結果の最後

192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC.[TAB]Router 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc.[TAB]iMac-John 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc.[TAB]iMac-Peter 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd[TAB]Erik's Android 

IP[TAB]MAC[TAB]VENDOR[TAB]HOSTNAME 

これは私がしたいのですが、結果であります

私は、このコマンドで簡単に3つの第1列を取得することができます:

sudo arp-scan -l | tail -n +3 | head -n -3 

結果:

問題は、第4列を追加することです。私はawkコマンドで処理しようとしていますが、好きな書式ではなく新しい行に結果が表示されます。

sudo arp-scan -l | tail -n +3 | head -n -3 | awk -F '\t' '{ print $0 system("getent hosts " $1) }' 

予期しない結果:

192.168.1.1[TAB]Router 
192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC. 
192.168.1.2[TAB]iMac-John 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.52[TAB]iMac-Peter 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.26[TAB]Erik's Android 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd 

任意の助けが理解されるであろう!

+4

[編集]簡潔な、テスト可能なサンプル入力(の出力を含むようにあなたの質問にsudo arp- scan-l)と期待される出力。 –

+0

おそらくIPアドレスが共通鍵です。 'join'コマンドを調べます。 –

答えて

2

現在のawkコマンドの正しい構文は次のとおりです。

awk 'BEGIN { FS=OFS="\t" } 
{ 
    cmd="getent hosts \"" $1 "\"" 
    $0 = $0 OFS ((cmd | getline line) > 0 ? line : "N/A") 
}1' 

が、あなただけのawkでNR>2{...}を行うことができ、あなたがheadを必要としない良いチャンスがありますので、あなたは間違いなくtailを必要としませんいずれにしても、生を見ていなくてもarp-scanの出力は推測できます。

も ​​- これはあなたがawkをしてやっているすべてであるならば、あなたはおそらく代わりにシェルを使用する必要があります:

while IFS=$'\t' read -r ip rest; do 
    printf '%s\t%s\t%s\n' "$ip" "$rest" $(getent hosts "$ip") 
done 
+0

答えをありがとう!セパレータの最後にあるHOSTNAMEの行は[TAB]ではなく、N/Aの行は[TAB]であることが検出されました。これをどのように修正できますか? –

+1

あなたは歓迎ですが、それは不可能です。このタブは、ホスト名またはN/Aがそれに続くかどうかに関係なく、タブが存在するように、三項式の前に置かれる 'FS'によって生成されます。スクリプトが 'print $ 0 '\ t" hostname'または 'print $ 0"を実行しているかどうか\ t "" N/A "'出力は '$ 0" \ t "'どちらかで始まります。その 'FS'は実際には' OFS'btwでなければならないので、私は答えを更新しようとしていますが、それは美容上の変更であり、両方の変数に '\ t'という値があるので機能的には全く違いがありません。 –

関連する問題