반달가면 이글루에서 백업 - 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
'bash script' 카테고리의 다른 글
[bash: grep] 파일에 저장된 여러개의 검색어를 포함 또는 제외한 내용 출력하기 (0) | 2023.09.08 |
---|---|
[bash: stat] 현재 파일이 전송되고 있는 중인지 판단하기 - 2 (0) | 2023.09.08 |
[bash: grep] 파일 안에 섞인 바이너리(binary) 데이터 제거 (1) | 2023.09.04 |
[bash: cd] 디렉토리 내용 새로 고침(refresh) (0) | 2023.09.04 |
[bash: nl, awk] 결과 출력에 행번호를 같이 표시하기 (0) | 2023.09.04 |