bash script2023. 9. 15. 17:39

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/621562

awk에서 특정 문자열 패턴과 일치하는 부분이 있을 경우, 일치하는 부분만 출력하는 방법이다. grep에서 -o 옵션으로 일치하는 부분만 골라서 출력하는 것과 동일한 기능이나(grep의 -o 옵션에 대한 내용은 이전 게시물을 참고하자. 여기로), awk에서는 좀 더 복잡한 작업들과 조합해서 사용할 수 있으므로 알아두면 편리하다.

아래의 예시를 보자. 입력된 행에 문자열 "abc"가 있는지 확인하여 있을 경우 해당 부분만 출력하는 경우다.

echo "abcdefg" | awk 'match($0,/abc/) { print substr($0,RSTART,RLENGTH) }'
abc

match 함수를 이용하여 일치하는 부분이 있는지 확인한 후에 문자열 일부를 출력하기 위해 substr 함수를 사용했다. match 함수에서 행 전체($0)를 대상으로 문자열 abc를 검색하고, 만약 일치하는 부분이 있으면 print 명령이 실행된다.

match 함수를 호출하면 일치하는 부분의 시작 위치와 길이는 내부 변수인 RSTART, RLENGTH에 각각 저장되므로, substr 함수의 인자(argument)로 사용하면 된다. (awk의 substr 함수에 대한 좀 더 자세한 내용은 이전 게시물을 참고하자. 여기로)

조금 더 복잡한 상황을 생각해 보자. 탭(tab)으로 구분된 입력에서 두번째 항목(field)에 연속되는 3개의 수자가 있는지 확인하고, 만약 있으면 첫번째 항목과 두번째 항목을 출력하는 경우다.

echo -e "abc\tdef012345\tABC" | awk -F '\t' 'match($2,/[0-9][0-9][0-9]/) { print $1 "\t" substr($2,RSTART,RLENGTH) }'
abc  012

awk의 -F 옵션을 이용하여 구분자를 탭으로 지정해 주었다. match 함수에서는 대상을 두번째 항목($2)으로 한정하고 수자를 찾아야 하므로 정규표현식(regular expression, regex)을 사용하여 패턴을 지정했다. 출력하는 부분의 substr 함수의 대상 항목도 match 함수와 일치시켜 $2로 지정해 준다는 점에 유의.

test.txt 파일에 저장된 내용을 가지고 위와 같은 작업을 한다면 아래와 같이 될 것이다.  

awk -F '\t' 'match($2,/[0-9][0-9][0-9]/) { print $1 "\t" substr($2,RSTART,RLENGTH) }' test.txt

여러 항목이 있는 자료를 읽어서 특정 항목에서 내가 원하는 부분만 추출하여 나머지 항목과 함께 출력하고 싶을 경우 매우 요긴하게 활용할 수 있다.

728x90
Posted by 반달가면