2013-10-02 75 views
1

我有了這樣的你怎麼能下的IP地址

10.9.0.57: Name= franks box 
    Model= Pke2100 
    Version= 7.5.1.100 build 7 
10.9.0.65: Name= TFD 
    Model= BFG 9000 
    Version= 7.6.1.0 build 15 
10.9.0.64: Name= unit 12 
    Model= ML-200 
    Version= 7.5.1.0 build 50 

我想通過IP地址文本排序,數據的文本文件排序文本行包括屬於該兩條線IP地址

因此所需的輸出將

10.9.0.57: Name= franks box 
    Model= Pke2100 
    Version= 7.5.1.100 build 7 
10.9.0.64: Name= unit 12 
    Model= ML-200 
    Version= 7.5.1.0 build 50 
10.9.0.65: Name= TFD 
    Model= BFG 9000 
    Version= 7.6.1.0 build 15 

我明白任何建議

+0

你僅限於Linux,Sed和AWK嗎?你只對結果或代碼感興趣嗎? – NoChance

回答

1

這應該爲你工作:

awk '/^[0-9]/ {$0="\n"$0} 1 {printf "%s,",$0}' file | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | awk '{sub(/^\n/,"")}NF' RS=, 
10.9.0.57: Name= franks box 
    Model= Pke2100 
    Version= 7.5.1.100 build 7 
10.9.0.64: Name= unit 12 
    Model= ML-200 
    Version= 7.5.1.0 build 50 
10.9.0.65: Name= TFD 
    Model= BFG 9000 
    Version= 7.6.1.0 build 15 

獲得在一行中的所有入口,那種使用外部排序對IP的各個領域,然後把它返回到原來的格式。

編輯:更短的版本(每一條記錄必須準確3系這個工作):

awk 'NR%3{printf "%s,",$0;next}1' file | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 | awk 1 RS=, 
+0

嘗試了較短的版本,它的工作完美。結果總是3行,所以這個技巧。 –

0

這裏是唯一awk的解決方案:

/^[0-9][0-9.]*:/ { 
    split ($1,c,"[.:]") 
    i=i+1; s[i]="" 
    for (k=1; k<=4; k++) { 
     s[i]=(s[i] sprintf("%03d", c[k])) 
    } 
    s[i]=(s[i] " "i); a[i]="" 
} 
{ 
    a[i]=(a[i] $0 "\n") 
} 

END { 
    asort(s) 
    for (j=1; j<=i; j++) { 
     split(s[j],c," "); ind=c[2] 
     printf "%s", a[ind] 
    } 
} 
+0

不起作用。它在'10.2.0.65'之前對'10.100.0.64'進行排序。您需要對所有八位字節進行排序。 '10.9.0.100'同樣的錯誤在'10.9.0.64'之前排序並不是所有的awk都有'asort'。 – Jotne

+0

感謝您的評論!我更新瞭解決方案。 –

+0

它看起來更好。您可以刪除'sub(「:」,「」,$ 1)'並將split($ 1,c,「。」)'改爲'split($ 1,c,「[:]」)''。每個部分之間還有一個額外的空間。 IP後,你會錯過':'。 – Jotne

1

如果數量記錄中的字段是恆定的:

$ xargs -n10 < file | sort -V | sed 's/ \w*=/\n &/2g' 
10.9.0.57: Name= franks box 
    Model= Pke2100 
    Version= 7.5.1.100 build 7 
10.9.0.64: Name= unit 12 
    Model= ML-200 
    Version= 7.5.1.0 build 50 
10.9.0.65: Name= TFD 
    Model= BFG 9000 
    Version= 7.6.1.0 build 15 

如果字段數a再沒有那麼常數:

$ pr -ats' ' --columns 3 file | sort -V | sed -r 's/\s*(\w+=)/\n \1/2g' 
10.9.0.57: Name= franks box 
    Model= Pke2100 
    Version= 7.5.1.100 build 7 
10.9.0.64: Name= unit 12 
    Model= ML-200 
    Version= 7.5.1.0 build 50 
10.9.0.65: Name= TFD 
    Model= BFG 9000 
    Version= 7.6.1.0 build 15 
1
$ awk '/^[^ ]/{ip=$1;gsub(/[.:]/,"\t",ip)}{print ip NR "\t" $0}' file |sort -n |cut -f6- 
10.9.0.57: Name= franks box 
    Model= Pke2100 
    Version= 7.5.1.100 build 7 
10.9.0.64: Name= unit 12 
    Model= ML-200 
    Version= 7.5.1.0 build 50 
10.9.0.65: Name= TFD 
    Model= BFG 9000 
    Version= 7.6.1.0 build 15 

它的工作原理是在每行的開始打印的IP地址(「」與S由製表符替換)和行號,那麼就做一個數字排序,然後刪除爲排序添加的IP地址和行號。