2012-01-30 56 views
5

我剛剛在vim中發現了命令:sort n(我怎麼知道這個?!),它有差不多完成了我所需要的。在vim中排序IP地址

但是,我想排序的是一長串IP地址(它是「允許主機」文件在我們的apache配置文件中爲Include d),並且:sort n能很好地識別這123.45.6.7應排123.45.16.7之前(例如)。

它是一個安全的假設,我應約不那麼強迫症,不擔心,因爲我不打算要能夠做到這一點沒有婉轉複雜sedawk命令還是什麼?

需要明確的是,該行的所有看起來像:

Allow from 1.2.3.4 
Allow from 5.6.7.8 
Allow from 9.10.11.12 

回答

8

Vim的排序似乎是在實踐中穩定(但不保證)。因此,你可以嘗試:

:%sort n /.*\./ 
:%sort n /\.\d\+\./ 
:%sort n /\./ 
:%sort n 

這將通過數最後一個點後排序(*是貪婪),然後通過第一點後數下一個點和數字,然後按編號的第一個點後,和最後按第一個數字。

+0

幾乎完全完美(也是唯一的原因,不是因爲我沒有提到我的一些行是網絡掩碼)。謝謝;這讓我足以將自己的網絡掩碼排序出來。 – 2012-01-30 18:00:57

+1

使用管道,你可以一次執行它:':%sort n /.*\./ | %sort n /\.\d\+\./ | %sort n /\./ | %sort n' – azzid 2015-01-13 12:39:57

0

我不是vim的用戶,所以我不能提供一個直接的方式與內建命令做到這一點,但它可能與輸出替換文本的一部分它通過一個命令來運行。所以,這樣一個簡單的腳本可以使用:

#!/usr/bin/python 

import sys 

input_lines = sys.stdin.readlines() 
sorted_lines = sorted(input_lines, 
         key=lambda line: map(int, line.split()[-1].split('.'))) 
for line in sorted_lines: 
    sys.stdout.write(line) 

https://www.linux.com/learn/tutorials/442419-vim-tips-working-with-external-commands,節「通過外部過濾器過濾文本」,這也解釋瞭如何使用這個作爲VIM內的過濾器。

這個腳本應該做你想要什麼,在哪裏所有選定行的IPv4地址結束的任何區域將工作。

+0

天哪,謝謝。我試圖避免通過腳本運行(主要是因爲它是一個不活,還生產服務器,所以有一個最基本的安裝和'python'不在那裏),但是這看起來驚人的;謝謝! – 2012-01-30 18:02:23

2

還有就是要實現正確排序的可靠方式:前置零到 地址號碼,這樣所有的人組成的三位數。

  1. 在數字前加上零。

    :%s/\<\d\d\?\>/0&/g|%&& 
    
  2. 將比較IP地址的行分類爲文本。

    :sort r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/ 
    
  3. 去掉多餘的前導零。

    :%s/\<00\?\ze\d//g 
    

要運行所有三個步驟爲一個命令,使用一個班輪

:%s/\<\d\d\?\>/0&/g|%&&|sor r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/|%s/\<00\?\ze\d//g