bash script2023. 9. 8. 13:11

 

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

여러개의 항목 또는 필드(field)로 이루어진 내용에서 특정한 항목의 값이 있는지 없는지 판별할 때, 즉 특정한 필드 값의 유무에 따라 선별을 해야 할 경우에 awk를 활용할 수 있다. (우선 awk에서 조건에 따른 작업에 대한 기본적인 내용은 이전 게시물을 참고하자. 여기로)

예를 들어 이름, 전화번호, 이메일을 저장한 파일에서 전화번호가 없는 사람만 골라서 출력한다거나 아니면 이메딜 주소가 있는 사람만 출력하는 경우다. 각 항목을 탭(tab)으로 구분한다고 가정한다.

# list.txt 파일 내용 확인
cat list.txt
john    123-1234    john@test.net
jane        jane@test.net
sam    222-3434

위의 예시에서 탭이 구분자이므로 전화번호가 없는 jane의 경우 "jane[탭][탭]jane@test.net" 이런 형태다.

awk로 전화번호가 없는 행을 출력하려면 아래와 같이 하면 되겠다. 구분자가 탭이므로 -F 옵션으로 구분자를 지정해 주고, 전화번호는 두번째 필드이므로 if 조건문을 이용해서 $2에 대해 값이 없는지 확인한다.

# 2번째 필드(전화번호)가 없을 경우 행 전체 출력, 구분자는 탭
awk -F '\t' '{ if ($2=="") { print $0 } }' list.txt
jane        jane@test.net

# 2번째 필드(전화번호)가 없을 경우 첫번째 필드(이름)만 출력
awk -F '\t' '{ if ($2=="") { print $1 } }' list.txt
jane

반대로 전화번호가 있는 행을 출력하려면 아래와 같이 하면 되겠다. 정규표현식에서 공백을 제외한 출력가능한 문자의 집합([[:graph:]])이 두번째 필드에 포함되어 있으면 출력하는 식이다.

# 2번째 필드(전화번호)가 있을 경우 이름과 이메일 주소 출력
awk -F '\t' '$2~/[[:graph:]]/ { print $1 "\t" $3 }' list.txt
john    john@test.net
sam

728x90
Posted by 반달가면