bash/sed에서 값을 계산으로 바꾸는 방법

bash/sed에서 값을 계산으로 바꾸는 방법

나는 bash sed를 사용하여 파일 세트(예: 10.1.1.x => 10.2.2.x-19)의 IP 주소를 대체합니다.

file1: 10.1.1.29 => 10.2.2.10, 
file2: 10.1.1.30 => 10.2.2.11, 
file3: 10.1.1.31 => 10.2.2.12, 

등.

나는 거의 그것을 했다:

for file in ifcfg* ; do sed -e "s/10.1.1./10.2.2./" $file >tmp/$file ; done

하지만 마지막 주소 위치(x => x-19)를 계산하고 바꾸는 방법을 알 수 없습니다.

정말 쉬울 수도 있는데...

답변1

이 작업을 수행하려면 sed 대신 awk를 사용하는 것이 더 좋습니다.

awk -F. '{printf ("%d.%d.%d.%d\n",$1,$2,$3,$NF-19)}'

또는 귀하의 예를 따르면

awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}'

또는

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}' $file >tmp/$file
done

다른 행을 유지하고 이것이 x대체될 행의 마지막 요소라고 가정하려면 다음을 수행하십시오.

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("%s.%d.%d.%d\n",$1,2,2,$NF-19)}
             !/10.1.1/ {print $0}' $file > tmp/$file
done

답변2

한 가지 방법은 다음과 같습니다.

$ for file in ifcfg*; do
    num=$(grep IPADDR $file|awk -F. '{print $4}')
    sed -e "s/10.1.1.[0-9]\+/10.2.2.$(($num-19))/" $file >tmp/$file
  done

그러면 IP 주소의 내용을 가져와서 4번째 옥텟으로 줄여 변수에 저장합니다 $num. 그런 다음 명령 19중에 해당 변수를 추가하십시오 sed. 기존 4번째 옥텟을 sed추가 및 제거하여 원본 콘텐츠를 확장 해야 합니다 .[0-9]\+$num+19

답변3

awk 'BEGIN{FS=OFS="."} {$NF -= 19; print $0 > ("tmp/" FILENAME)}' ifcfg*

답변4

나는 이것을 위해 Perl을 사용할 것입니다:

$ grep '10\.' file[123]
file1:10.1.1.29
file2:10.1.1.30
file3:10.1.1.31

$ perl -i -pe 's/10\.1\.1\.(\d+)/ "10.2.2." . ($1 - 19) /ge' file[123]

$ grep '10\.' file[123]
file1:10.2.2.10
file2:10.2.2.11
file3:10.2.2.12

관련 정보