2013-10-22 106 views
1

我解析提取的字符串的結果。我的問題是在處理第一個元素後停止執行。擊不繼續執行

這是我的代碼:

#!/bin/bash 

SCAN_RESULT=$(arp-scan --ignoredups --interface=$1 --localnet) 
HEADER_REMOVED=$(echo "$SCAN_RESULT" | sed '1,2d') 
NO_HEADER_LINE_COUNT=$(echo "$HEADER_REMOVED" | wc -l) 
CAPTURED_DEVICE_INFO=$(echo "$HEADER_REMOVED" | sed $(expr $NO_HEADER_LINE_COUNT - 2),"$NO_HEADER_LINE_COUNT"d) 
DATA=$(echo "$CAPTURED_DEVICE_INFO" | sed 's/[\t]/;/g') 

DATA_LINE_COUNT=$(echo "$DATA" | wc -l) 

echo -n '[' 
for ((i=0; i<$DATA_LINE_COUNT; i++)) # stops execution after 1st cycle 
do 
    EXTRACTED_DATA=$(echo "$DATA" | sed $(expr "$i" + 1)'!d') 
    echo -n '{' 
    COMMA_INNER='' 
    for i in {1..3} 
    do 
     echo -n "$COMMA_INNER"  
     case $i in 
      1) echo -n '"ip":' ;; 
      2) echo -n '"mac":' ;; 
      3) echo -n '"manufacturer":' ;; 
     esac 
     echo -n '"' 
     echo -n $(echo $EXTRACTED_DATA | cut -d ';' -f$i) 
     echo -n '"' 
     COMMA_INNER=',' 
    done 
    echo -n '}' 
done 
echo -n ']' 

這是從ARP掃描輸出字符串:

Interface: eth0, datalink type: EN10MB (Ethernet) 
Starting arp-scan 1.8.1 with 16 hosts (http://www.nta-monitor.com/tools/arp-scan/) 
192.168.0.1  20:aa:4b:c0:22:78  (Unknown) 
192.168.0.5  48:5b:39:a0:60:ba  ASUSTek COMPUTER INC. 
192.168.0.7  04:7d:7b:7d:c4:e9  (Unknown) 

5 packets received by filter, 0 packets dropped by kernel 
Ending arp-scan 1.8.1: 16 hosts scanned in 0.819 seconds (19.54 hosts/sec). 3 responded 

這是字符串(從ARP掃描)我想要被處理和回送爲JSON

192.168.0.1  20:aa:4b:c0:22:78  (Unknown) 
192.168.0.5  48:5b:39:a0:60:ba  ASUSTek COMPUTER INC. 
192.168.0.7  04:7d:7b:7d:c4:e9  (Unknown) 

下面是示例輸出:

[{"ip":"192.168.0.1","mac":"20:aa:4b:c0:22:78","manufacturer":"(Unknown)"}] 

上午我做錯了?

+0

我不知道SED,但我認爲你可以做到這一點容易得多使用awk –

+0

這將是像Python,Perl和Ruby或用適當的JSON庫的東西語言要容易得多。 – chepner

回答

1
arp-scan --ignoredups --interface=$1 --localnet | { 
    read; read # Discard the first two header lines 
    printf "[" 
    comma='' 
    while read ip mac manufacturer; do 
    printf '%s{"ip":"%s", "mac":"%s", "manufacturer":"%s"},' "$comma" "$ip" "$mac" "$manufactuer" 
    comma=',' 
    done 
    printf "]\n" 
} 
+0

謝謝!我只是修改一些部分,使其完成。 – ltlynx

1

要拆分與cut行(使用' '而不是​​3210)在使用

  • 相同的變量(i)兩個循環和
  • 錯誤的分隔符。

然而,chepner的解決方案都要好得多。

1

如果我理解正確你的問題(一個大如果,這是極不明確),這將做到這一點:

sed '1,2d;s/^/[{"ip":"/;s/ */","mac":"/;s/ */","manufacturer":"/;s/$/"}]/'