...pudding - diary

この日記は https://yapud.hatenablog.com/ に引っ越し中


2013-02-21

_ [Software] 1レコードが複数行のフィールドをもつテキストデータを awk で1レコード1行に並べる

ローカルネットワークに居るホストの一覧を出したかった。1行1IPで。nmap で生きてるホストを探し、 -oG オプションなどで CSV に出したのだけど MAC アドレスが入ってこない。-oX オプションでXMLに出せるのだけど今手元でスグに使えるパーサが無い。というわけで普通の出力すなわち1レコード複数行のを1行にまとめることにした。

ふつうに nmap するとこうなる。名前解決するな+ICMP ECHOで探せ、という命令でこんな感じです。

# nmap -n -PE -sP 192.168.0.1-10
 
Starting Nmap 5.51 ( http://nmap.org ) at 2013-02-21 23:03 JST
Nmap scan report for 192.168.0.1
Host is up (0.082s latency).
MAC Address: 00:0D:02:xx:xx:xx (NEC AccessTechnica)
Nmap scan report for 192.168.0.3
Host is up (0.083s latency).
MAC Address: 00:1C:7E:xx:xx:xx (Toshiba)
Nmap scan report for 192.168.0.5
Host is up (0.083s latency).
MAC Address: 00:1F:3C:xx:xx:xx (Intel Corporate)
Nmap scan report for 192.168.0.6
Host is up (0.087s latency).
MAC Address: 10:1F:74:xx:xx:xx (Unknown)
Nmap scan report for 192.168.0.7
Host is up (0.00025s latency).
MAC Address: 00:24:D7:xx:xx:xx (Intel Corporate)
Nmap done: 10 IP addresses (5 hosts up) scanned in 0.89 seconds

3行で1レコードです。各レコードは "Nmap scan report for " ではじまるという特徴があります。これを目印に加工しましょう。

レコードの区切り指定します。 「-v RS='Nmap scan report for '

レコード内のフィールドの区切りを指定します。「-v FS='\n'

出力時のフィールド区切り文字を指定します。「-v OFS='\t'

そしてフィールドを並べて出します(ただし192ではじまる行のみ)。「'/^192/{print $1,$2,$3}'

こんなかんじでどうでしょう。

# nmap -n -PE -sP 192.168.0.1-10 | awk -v OFS='\t' -v RS='Nmap scan report for ' -v FS='\n' '/^192/{print $1,$2,$3}'
 
192.168.0.1     Host is up (0.0021s latency).   MAC Address: 00:0D:02:xx:xx:xx (NEC AccessTechnica)
192.168.0.3     Host is up (0.0020s latency).   MAC Address: 00:1C:7E:xx:xx:xx (Toshiba)
192.168.0.5     Host is up (0.0034s latency).   MAC Address: 00:1F:3C:xx:xx:xx (Intel Corporate)
192.168.0.6     Host is up (0.0073s latency).   MAC Address: 10:1F:74:xx:xx:xx (Unknown)
192.168.0.7     Host is up (0.00022s latency).  MAC Address: 00:24:D7:xx:xx:xx (Intel Corporate)

規則性のある出力値をちょこちょこっと編集するのにとても便利ですねawk。


2013年
2月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
Twitter : @moriya_jp