AWK를 사용하여 특정 문자열 앞에 오는 대괄호 사이의 값을 추출하는 방법

AWK를 사용하여 특정 문자열 앞에 오는 대괄호 사이의 값을 추출하는 방법

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

관련 정보