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-scan からの出力文字列です。

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

これは、処理して JSON としてエコーしたい (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)

出力例は次のとおりです。

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

私はそれを間違っていますか?

4

3 に答える 3

1

使用している

  • iループとループの両方に同じ変数 ( )
  • で行を分割するときの区切り文字が間違っています (の代わりにcut使用します)。' '';'

ただし、chepner のソリューションははるかに優れているはずです。

于 2013-10-22T18:36:54.677 に答える
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"
}
于 2013-10-22T17:53:52.627 に答える
1

私があなたの質問を正しく理解していれば(大きなif、非常に不明確です)、これでうまくいきます:

sed '1,2d;s/^/[{"ip":"/;s/  */","mac":"/;s/  */","manufacturer":"/;s/$/"}]/'
于 2013-10-22T21:18:17.270 に答える