IP awk의 마지막 옥텟 변경

IP awk의 마지막 옥텟 변경

다음 파일이 있다고 가정합니다.

Somestring 1.2.3.4 more charachters and strings
Somestring 1.2.3.5 more charachters and strings
Somestring 1.2.3.6 more charachters and strings

IP의 마지막 옥텟을 변경하고 싶습니다.

Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

awk나 sed에서 어떻게 이를 달성할 수 있나요?

내가 한 일은 다음과 같습니다.

awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH-1); print ip }' file  

그러나 이것은 단지 IP를 인쇄할 뿐이고 완전히 정확하지는 않습니다.

또한 다음을 시도했습니다.

awk '{split($2,ip,".") gsub(ip[2],"x"); print}' 

그러나 이 역시 첫 번째 옥텟을 대체하므로 올바르지 않습니다.

Somestring x.2.3.x more charachters and strings
Somestring x.2.3.x more charachters and strings
Somestring x.2.3.x more charachters and strings

도와 주셔서 감사합니다

답변1

이 목적을 위해 sed:

$ sed -E 's/ (([0-9]{1,3}\.){3})[0-9]{1,3} / \1x /' file
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

[0-9]{1,3}\.이는 공백 뒤에 세 개의 그룹 (1~3자리 숫자 뒤에 점이 있음)을 찾아서 캡처합니다. 그런 다음 마지막 그룹 과 마지막 공백 \1도 바꿉니다 . 이것은 모두 세 개의 숫자와 점이 있는 첫 번째 세트가 있는 위치 [0-9]{1,3}로 대체됩니다 .␣\1x␣\1

답변2

정말로 이 작업을 수행하려면 앵커 표현식이 필요합니다. 예를 들어 단일 대체이기 때문에 앵커 표현식 awk만 필요합니다.subgsub

awk '{sub(/\.[0-9][0-9]?[0-9]?$/,".x",$2)} 1' input
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

그리고일부[0-9]{1,3}ERE를 사용하여 숫자 반복을 달성할 수 있습니다.

답변3

awk '{sub(/.$/,"x",$2)}1' file

Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings
Somestring 1.2.3.x more charachters and strings

관련 정보