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