2012-01-30 20 views
5

Właśnie odkryłem polecenie :sort n w vim (jak nie wiedziałem o tym ?!), które ma prawie zrobione dokładnie to, czego potrzebuję.Sortowanie adresów IP w vim

Co jednak próbuję posortować, to długa lista adresów IP (plik "allow hosts" to Include d do naszej konfiguracji apache), a byłoby miło, gdyby :sort n mógł rozpoznać to 123.45.6.7 powinno sortować przed 123.45.16.7 (na przykład).

Czy to bezpieczne założenie, że powinienem być mniej OCD i nie martwić się, ponieważ nie będę w stanie zrobić tego bez łagodnie złożonego polecenia: sed lub awk czy coś takiego?

Żeby było jasne, wiersze wszystkie wyglądać następująco:

Allow from 1.2.3.4 
Allow from 5.6.7.8 
Allow from 9.10.11.12 

itp

Odpowiedz

8

Vim porządek wydaje się być stabilny w praktyce (ale to nie jest gwarantowana). Dlatego można spróbować:

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

Jakie będą sortować według numeru po ostatniej kropce (* jest chciwy), a następnie przez liczbę po pierwszej kropce po kropce i cyfr, a następnie przez liczbę po pierwszej kropce, a ostatni przez pierwszą liczbę.

+0

Prawie całkowicie perfekcyjnie (i jedynym powodem, dla którego to nie było, ponieważ nie wspomniałem, że niektóre z moich wierszy były maskami sieci). Dziękuję Ci; Dostałem mnie wystarczająco daleko, żeby samemu uporządkować maski sieciowe. –

+1

Używając potoku możesz wykonać go za jednym razem: ':% sortuj n /.*\./ | % sortuj n/\\\\\\\\\\\\ % sortuj n/s./ | % sortuj n' – azzid

0

Nie jestem użytkownikiem vim, więc nie mogę oferują bezpośredni sposób to zrobić z wbudowanych poleceń jednak możliwe jest zastąpienie sekcji tekstu przez jej wyjście uruchamiane przez polecenie. Tak więc, prosty skrypt, jak to może być używane:

#!/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) 

Zobacz https://www.linux.com/learn/tutorials/442419-vim-tips-working-with-external-commands, sekcja „tekst filtrowania przez zewnętrznych filtrów”, który wyjaśnia, jak można to wykorzystać jako filtr w vim.

Ten skrypt powinien robić to, co chcesz i będzie działać na dowolnym obszarze, gdzie wszystkie wybrane wiersze kończą się adres IPv4.

+0

Boże, dziękuję. Próbowałem uniknąć uruchamiania skryptu (głównie dlatego, że jest to serwer, który nie był jeszcze produkowany na żywo, ale ma instalację "bare-bone" i nie ma tam "pythona"), ale wygląda to niesamowicie; Dziękuję Ci! –

2

Istnieje niezawodny sposób na uzyskanie prawidłowego sortowania: dodawanie zera do numerów adresów , tak aby wszystkie z nich składały się z trzech cyfr.

  1. Uzupełnij zera liczbami.

    :%s/\<\d\d\?\>/0&/g|%&& 
    
  2. Posortuj linie porównujące adresy IP jako tekst.

    :sort r/\(\d\{3}\)\%(\.\d\{3}\)\{3}/ 
    
  3. Usuń nadmiarowe zera wiodące.

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

Aby uruchomić wszystkie trzy kroki jako jednego polecenia, użyj jednej-liner

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