Bash, 점으로 구분된 문자열에서 IP 자르기

Bash, 점으로 구분된 문자열에서 IP 자르기

여러 형식의 결과가 있습니다.

10.3.2.1.in-addr.arpa name hostname

중간 부분 ".in-addr.arpa"를 제거하고 IP 주소를 1.2.3.10으로 바꾸고 싶습니다. 간단한 bash oneliner로 이 작업을 수행할 수 있습니까? 미리 감사드립니다. 이 작업을 몇 시간 동안 시도했는데 약간 멈췄습니다.

답변1

그리고 perl:

perl -pe 's/(\d+)\.(\d+)\.(\d+)\.(\d+)\.in-addr\.arpa/$4.$3.$2.$1/g' < input

표준에 상응하는 것보다 더 간결하고 읽기 쉽습니다 sed.

d='\([0-9]\{1,\}\)'
LC_ALL=C sed "s/$d\.$d\.$d\.$d\.in-addr\.arpa/\4.\3.\2.\1/g" < input

이는 모든 항목을 (여기서 는 하나 이상의 십진수로 구성된 임의의 시퀀스) <d1>.<d2>.<d3>.<d4>.in-addr.arpa로 대체되고 다른 모든 항목은 변경되지 않습니다.<d4>.<d3>.<d2>.<d1><dX>

답변2

$ awk '{split($1,p,"."); $1=p[4]"."p[3]"."p[2]"."p[1]} 1' file
1.2.3.10 name hostname

답변3

또 다른 Perl 접근 방식:

$ perl -lane '@ip=split(/\./,$F[0]); $F[0]=join(".",reverse(@ip[0..3])); print "@F"' file
1.2.3.10 name hostname

여기서는 .줄의 처음 4개 구분 요소가 IP 주소라고 가정합니다.

설명하다

  • -lane: 이 명령은 -a입력의 각 줄을 공백으로 분할하고 결과를 배열에 저장하는 방식으로 작동합니다. 각 호출에 줄 바꿈을 추가하고 입력 줄에서 후행 줄 바꿈을 제거합니다. 이는 "입력을 한 줄씩 읽고 주어진 스크립트를 각 줄에 적용"하는 것을 의미합니다.perlawk@F-lprint-n-e
  • @ip=split(/\./,$F[0]): 첫 번째 필드( $F[0])를 가져와서 분할하여 .출력을 배열에 저장합니다 @ip.
  • $F[0]=join(".",reverse(@ip[0..3]));: 여기에는 여러 부분이 있습니다. 먼저 join(CHAR, ARRAY)ARRAY의 요소는 CHAR 문자를 사용하여 문자열로 연결됩니다. 여기서는 배열의 처음 4개 요소(인덱스 0~3)를 전달하므로 @ip예제에서는 숫자가 아닌 요소까지 모든 요소가 연결되므로 IP가 생성됩니다. 다음으로 reverse뒤집어 보세요. 마지막으로 결과를 $F[0].
  • print "@F": 이전 단계를 마친 후 @F이제 배열에 우리가 원하는 내용이 포함되어 있으므로 이를 인쇄합니다.

원하는 것이 입력 파일의 모든 줄에서 처음 나타나는 문자열을 제거한 .in-addr.arpa다음 IP를 바꾸는 것이라면 다음과 같이 할 수 있습니다.

$ perl -pe 's/\.in-addr\.arpa//; s/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/$4.$3.$2.$1/' file
1.2.3.10 name hostname

답변4

또 다른 방법은 정규식에 역추적을 설정하고 역추적이 시작 부분에 도달하면 중지하는 정규식에 내장된 루핑/스캐닝 문자열을 활용하는 것입니다.

$ perl -lne '
    m/(.*) ((?<!\d)\d+\.) (?{printf q(%s), $1?$2:$2=~s|\.||r}) (?(?{$1 ne ""}) (?!))/x;
    print /(\s\S.*)/;
' file
1.2.3.10 name hostname

관련 정보