2012-01-30 2 views
5

vim에서 :sort n 명령을 발견했습니다. (어떻게 알지 못 했습니까?!) 거의이 필요합니다.vim에서 IP 주소 정렬

내가 정렬하려고하는 것은 IP 주소가 길다는 것입니다 ("허용 호스트"파일은 Include 아파치 설정에 들어 있습니다). :sort n을 인식 할 수 있으면 좋을 것입니다 그 123.45.6.7 전에 정렬해야합니다 (예를 들어).

가볍게 복잡한 sed 또는 awk 명령이나 이와 같은 작업을 수행 할 수 없으므로 걱정할 필요가 없다는 것이 안전한 가정인가요?

분명히하기 위해, 행 모두가 같은 모양 :

Allow from 1.2.3.4 
Allow from 5.6.7.8 
Allow from 9.10.11.12 

답변

8

Vim sort는 실제로 안정적으로 보입니다 (그러나 보장되지는 않습니다). 첫 번째 점 이후 수에 의해 다음, 도트와 숫자 다음 다음 첫 번째 점 이후 번호로, 마지막 점 후에 수를 기준으로 정렬됩니다

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

(*이 욕심), 마지막 그러므로 당신은 시도 할 수 있습니다 첫 번째 숫자만큼.

+0

거의 완벽하게 완벽했습니다 (그리고 내 행 중 일부가 넷 마스크라고 언급하지 않았기 때문에 그것이 유일한 이유였습니다). 고맙습니다; 나 자신이 넷 마스크를 분류 할 수있을 정도의 충분한 거리. –

+1

파이프를 사용하면 한 번에 모두 실행할 수 있습니다.': % sort n /.*\./ | % sort n /\.\d\+\./ | % sort n /\./ | % sort n' – azzid

0

나는 내가 내장 명령과 함께 할 수있는 직접적인 방법을 제공 할 수없는 정력 사용자가 아니에요, 그러나 텍스트의 일부를 명령을 통해 실행되는 출력으로 대체 할 수 있습니다. 그래서,이 같은 간단한 스크립트를 사용할 수 :

#!/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 절 "외부 필터를 통해 필터링 텍스트"를 참조하십시오.

이 스크립트는 사용자가 원하는대로 작동해야하며 선택한 모든 행이 IPv4 주소로 끝나는 모든 지역에서 작동합니다.

+0

선 (善)을 세 가지 단계를 실행하려면, 감사합니다. 스크립트를 통해 실행되는 것을 피하려고했습니다. (주로 프로덕션 서버가 아니기 때문에 맨손으로 설치하고 '파이썬'은 거기에 없기 때문에) 놀라운 결과를 보였습니다. 고맙습니다! –

2

정확한 정렬을 수행하는 확실한 방법이 있습니다. 주소 번호 앞에 0을 추가하여 모두 세 자리로 구성되도록하십시오.

  1. 숫자 앞에 0을 붙입니다.

    :%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