awk 표현식을 사용하여 대괄호 사이의 모든 값을 캡처할 수 있습니다.
'NR>1{print $1}' RS='(' FS=')'
하지만 구체적으로 일치하는 데 문제가 있습니다. 줄 번호가 아닌 문자열로 일치시키고 싶습니다. awk가 이것을 할 수 있는지 확실하지 않습니다.
원본 파일 내용은
if ($remote_addr ~ ^(1.2.3.4|5.6.7.8)$) {
set $maintenance off;
}
if ($maintenance = on) {
return 503;
}
다양한 순서로 여러 개의 괄호가 있습니다.
1.2.3.4|5.6.7.8
이 행에서 콘텐츠를 추출 해야 합니다.
if ($remote_addr ~ ^
(또는 포함된 줄에만 $remote_addr
).
답변1
한 줄로 간단하게 교체할 수 있으므로 sed를 사용하여 수행합니다.
$ sed -n 's/.*$remote_addr[^(]*(\([^)]*\).*/\1/p' file
1.2.3.4|5.6.7.8
정말로 awk를 사용하고 싶다면 아무 awk나 사용해도 됩니다:
$ awk 'sub(/.*\$remote_addr[^(]*\(/,"") && sub(/).*/,"")' file
1.2.3.4|5.6.7.8
답변2
추출하려는 내용을 고려하십시오.내부에대괄호 안의 명령문을 사용하여 if ($remote_addr ~ ( ... ) )
다음 awk
프로그램은 다음을 수행해야 합니다.
awk 'index($0,"$remote_addr"){sub(/^.*\(/,"");sub(/\).+$/,"");print}' inputfile
이는 문자열이 포함된 행과 일치합니다 $remote_addr
. 해당 줄 내에서 줄의 시작부터 마지막 줄까지의 모든 항목 (
과 )
첫 번째 줄부터 줄의 끝까지의 모든 항목이 삭제됩니다. 그런 다음 행의 나머지 값을 인쇄합니다.
답변3
당신은 또한 이것을 시도할 수 있습니다sed
sed -En '/\$remote_addr/ s/.*\(([0-9.]*\|[0-9.]*)\).*/\1/p' $file
모든 행과 일치한 $remote_addr
다음 일치 항목을 추출합니다.
암호~해야 한다먼저 명시적인 일치 없이 패턴을 일치시키는 기능입니다 $remote_addr
.
sed -En 's/.*\(([0-9.]*\|[0-9.]*)\).*/\1/p' $file
산출
1.2.3.4|5.6.7.8
답변4
awk '/\$remote_addr/{for(i=1;i<=NF;i++){if($i ~ /\([0-9].*|[0-9].*\)/){print $i}}}' filename|awk -F "(" '{gsub(/\).*/,"",$2);print $2}
산출
1.2.3.4|5.6.7.8