유닉스의 다른 파일에서 다른 텍스트로 텍스트 줄 바꾸기


2

정확한 하위 도메인 정보가있는 200 개가 넘는 바인드 확장 파일 목록이 있습니다.

예제 스키마는 다음과 같습니다.

# /named_ext/db.mysite.com
subdomain                    A       200.201.202.203

전체 줄을 세 개의 다른 줄로 바꿔야합니다.

subdomain                    A       200.201.202.204
subdomain                    A       200.201.202.205
subdomain                    A       200.201.202.206

모든 /named_ext/파일 에서 이러한 교체를 수행하는 방법을 알고 있습니까?


1
그래서 검색을위한 것 * A 200.201.202.203- 즉, 하위 도메인 이름,하지만 특정 및 IP 주소 또는 하위 도메인 각 파일에서 동일?
Paul

하위 도메인은 각 파일에서 동일합니다.
Martin

1
추가 할 IP는 항상 원래 IP의 증분입니까, 아니면 일정합니까?
발언자

그들은 상수입니다.
Martin

답변:


2

다음 perl 스크립트 exchange_ips.pl를 사용하여 3 개의 상수 ip (function exchange_const()) 또는 3 개의 증분 ip (function )로 ip를 교환 할 수 있습니다 exchange_incr(). #필요하지 않은 스크립트 끝에 함수 호출 앞에 주석 ( )을 추가하기 만하면 됩니다.

원래의 IP로 끝나 253거나 그 이상 이면 하나 이상의 증분 IP가 올바르지 않습니다 .

스크립트는로 시작하는 모든 줄을 수정합니다 $domainname. 도메인 이름이 중요하지 않거나 파일에 하나의 동일한 도메인에 대한 행만 포함 된 경우을 설정하십시오 my $domainname = ".+";.

#! / usr / bin / perl

엄격한 사용;
경고를 사용하십시오.

내 @ 데이터 = <STDIN>;

내 $ 도메인 이름 = "하위 도메인";
내 $ const_ip1 = "123.123.123.123";
내 $ const_ip2 = "124.124.124.124";
내 $ const_ip3 = "125.125.125.125";

내 $ pattern = qr / ^ ($ domainname \ s + A \ s +) ([\ d \.] +) / is;

하위 exchange_const ($) {
    내 $ dataref = 이동;
    내 $ found = 0;
    foreach (@ $ dataref) {
        if ($ _ = ~ m / $ pattern /) {
            그렇지 않으면 ($ found) {
                $ found = 1;
                printf "% s % s \ n % s % s \ n % s % s \ n", $ 1, $ const_ip1, $ 1, $ const_ip2, $ 1, $ const_ip3;
            }
        } else {
            인쇄 $ _;
        }
    }
}

sub exchange_incr ($) {
    내 $ dataref = 이동;
    내 $ found = 0;
    foreach (@ $ dataref) {
        if ($ _ = ~ m / $ pattern /) {
            그렇지 않으면 ($ found) {
                $ found = 1;
                내 $ const = $ 1;
                내 @iparr = split /\./, $ 2;
                (1 .. 3) {
                    $ iparr [3] ++;
                    printf "% s % s \ n", $ const, "."가입, @iparr;
                }
            }
        } else {
            인쇄 $ _;
        }
    }
}

# 일정한 IP로 IP 교환
exchange_const (\ @ 데이터);

# IP를 증분 IP로 교환
exchange_incr (\ @ 데이터);

다음과 같이 스크립트를 호출하십시오.

perl exchange_ips.pl < your_file

모든 파일을 반복합니다 (백업 포함).

for f in /named_ext/*; do rename s/$/.bak/ $f; perl exchange_ips.pl < $f.bak > $f; done

예:

수정할 샘플 파일 :

# foo
하위 도메인 A 200.201.202.203
# 중복
하위 도메인 A 200.201.202.203
# 어떤 바
기타 도메인 A 99.99.99.99
다른 도메인 A 1.1.1.1
# 또 다른 사본
하위 도메인 A 200.201.202.203

출력 exchange_const():

# foo
하위 도메인 A 123.123.123.123
하위 도메인 A 124.124.124.124
하위 도메인 A 125.125.125.125
# 중복
# 어떤 바
기타 도메인 A 99.99.99.99
다른 도메인 A 1.1.1.1
# 또 다른 사본

출력 exchange_incr():

# foo
하위 도메인 A 200.201.202.204
하위 도메인 A 200.201.202.205
하위 도메인 A 200.201.202.206
# 중복
# 어떤 바
기타 도메인 A 99.99.99.99
다른 도메인 A 1.1.1.1
# 또 다른 사본

훌륭하지만 루핑이 작동하지 않습니다. bak 파일을 생성하지 않는 것 같습니다.
Martin

어떤 경우에는 출발 선이 동일한 IP로 두 번 선언됩니다. 정규 표현식을 사용하여 두 번째 줄을 삭제하여 반품을 피하고 6 줄을 피하는 방법이 있습니까?
Martin

당신 @Martin 변경 시도 할 수 있습니다 rename s/$/.bak/ $f;mv $f $f.bak;있는 경우 루프에서 rename작동하지 않습니다. 또한 찾은 줄을 기억하고 후속 일치 항목을 무시하여 중복을 필터링하도록 답변 / 스크립트를 편집했습니다.
발언자

2

작은 bash 스크립트

sed각 파일에 대해 간단한 명령으로 이를 수행 할 수 있습니다 .

for f in ./named_ext/* ; do
    sed -r -i 's/subdomain[ ]+A[ ]+200.201.202.203/subdomain A 200.201.202.204\nsubdomain A 200.201.202.205\nsubdomain A 200.201.202.206/g' $f
done

설명

for 루프 는 파일을 사용하여 줄을 열거 ./named_ext/*하고 실행 sed합니다 $f. 는 -r정규 expressian을 확장하고 -i장소에 파일을 편집합니다.

정규식은

subdomain                    A       200.201.202.203

에 의해 몇 개의 공백으로

subdomain A 200.201.202.204
subdomain A 200.201.202.205
subdomain A 200.201.202.206

간격을 유지하려면 sed줄에 공백을 추가 할 수 있습니다 .


1
+1 마지막으로 sed! ;)
발언자

1
#!/bin/bash

tempFile=tempFile

for f in /named_ext/* ; do
    awk '
    BEGIN {FS = OFS = "."}

    /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ {
        for (i=0; i<3; i++) {
            $4++
            print $0
        }
    }' $f > $tempFile
    mv $tempFile $f
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.