awk를 사용하여 여러 패턴이 포함된 열 인쇄

awk를 사용하여 여러 패턴이 포함된 열 인쇄

awk여러 패턴이 포함된 열을 인쇄 해야 합니다 . 열 2와 "config" 및 "service"가 포함된 모든 열을 각각 인쇄해야 합니다.

문서 내용:

    build 345 java groovy /test:fail.txt /config:launcher.mxres /nickname:prod /service:session 
    auto 4986 java -xmx512 -d64 /test:pass.txt /nickname:deal /service:engine /config:launcher5.mxres
    build 912 binary.exe -f -t /test:code.txt /config:launcher_binary.mxres /service:scanner /nickname:input 

산출:

    345 /config:launcher.mxres /service:session
    4986 /config:launcher5.mxres /service:engine
    912 /config:launcher_binary.mxres /service:scanner

답변1

다음 awk스크립트는 각 행의 필드(열)를 반복하여 및 필드 /config:를 찾습니다 /service:. 일단 발견되면 이러한 필드의 전체 내용이 변수에 저장됩니다.

이러한 필드를 처리한 후 스크립트는 루프에서 찾은 필드뿐만 아니라 두 번째 필드의 데이터도 출력합니다. 그런 다음 프로세스는 계속해서 다음 줄로 들어갑니다.

{
    config = service = "";

    for (i = 3; i <= NF; ++i) {
        if ($i ~ "^/config:") {
            config = $i;
        } else if ($i ~ "^/service:") {
            service = $i;
        }
    }

    print $2, config, service;
}

이 스크립트는 테스트를 거쳤으며 gawk(GNU awk), mawk(Mike's awk) 및 nawk(BSD awk)에서 작동합니다.

제공한 데이터에 대해 다음 명령을 실행합니다.

$ awk -f script.awk data
345 /config:launcher.mxres /service:session
4986 /config:launcher5.mxres /service:engine
912 /config:launcher_binary.mxres /service:scanner

탭으로 구분된 출력을 원할 경우 BEGIN { OFS = "\t" }이를 스크립트 상단에 추가하세요.

...또는 원본 스크립트의 출력을 전달할 수 있습니다 column -t(열을 정렬해야 하는 경우 여러 공백이 삽입됩니다).

$ awk -f script.awk data | column -t
345   /config:launcher.mxres         /service:session
4986  /config:launcher5.mxres        /service:engine
912   /config:launcher_binary.mxres  /service:scanner

한 줄로:

$ awk '{ config = service = ""; for (i = 1; i <= NF; ++i) { if ($i ~ "^/config:") { config = $i } else if ($i ~ "^/service:") { service = $i } } print $2, config, service }' data | column -t

관련 정보