반달가면 이글루에서 백업 - http://bahndal.egloos.com/571605
행 전체가 아니라 특정한 위치(field)에 한정해서 문자열을 검색하는 방법이다. awk 명령에서 if 조건문을 사용하면 된다. 아래의 예시를 보자.
# test.txt 파일 내용 확인
cat test.txt
john 12345
jane 67890
# test.txt 파일에서 두번째 항목($2)이 12345일 경우 행 전체 출력(print $0)
awk '{ if ($2=="12345") print $0 }' test.txt
john 12345
# 두번째 항목이 12345일 경우 첫번째 항목만 출력(print $1)
awk '{ if ($2=="12345") print $1 }' test.txt
john
# 두번째 항목이 12345가 아닐 경우 행 전체를 출력
awk '{ if ($2!="12345") print $0 }' test.txt
jane 67890
만약 항목 구분자를 지정하고 싶다면 -F 옵션을 추가하면 된다.
# test2.txt 파일 내용 확인
cat test2.txt
john:12345
jane:67890
# 구분자는 ":", test2.txt 파일에서 두번째 항목이 12345일 경우 행 전체 출력
awk -F ':' '{ if ($2=="12345") print $0 }' test2.txt
john:12345
정확히 일치하는 문자열이 하니라 특정 문자열을 포함하는지 여부를 확인하려면 awk에서 제공하는 함수인 index()를 이용하면 된다. 형식은 index(in_str, find_str), 문자열 in_str에 find_str이 포함되는지 검색해서 일치하는 부분이 있으면 0이 아닌 값(nonzero)을, 없으면 0을 리턴한다. find_str 부분에 정규표현식(regular expression)을 사용할 수 없다는 점에 유의하자.
아래의 예시를 보자. awk 명령의 if 조건문 안에서 index 함수를 호출한 후 리턴값이 0이 아닌지 확인하는 방식으로 문자열 포함 여부를 판단할 수 있다.
# test.txt 파일에서 두번째 항목에 678이 포함되어 있으면 행 전체 출력
awk '{ if (index($2,"678")!=0) print $0 }' test.txt
jane 67890
검색하고자 하는 문자열이 스크립트에서 변수에 할당되어 있을 경우엔 -v 옵션을 추가하면 된다.
target_str="678"
# target_str 변수에 저장된 문자열이 test.txt 파일에서 두번째 항목에 포함되어 있으면 행 전체 출력
awk -v fstr="$target_str" '{ if (index($2, fstr)!=0) print $0 }' test.txt
jane 67890
위의 예시에 대해 간략히 설명하자면, 변수 target_str에 저장된 문자열을 awk의 -v 옵션을 이용해서 내부 변수 fstr을 선언하여 복사한 후에 index() 함수에 적용했다.
'bash script' 카테고리의 다른 글
[bash: ${}] 셸 파라메터 확장(shell parameter expansion) (0) | 2023.06.30 |
---|---|
[bash: expr] 특정 위치에서 특정 길이만큼 문자열 추출 (0) | 2023.06.30 |
[bash: date] 타임스탬프(timestamp)를 일반적인 표시 형식으로 변환 (0) | 2023.06.28 |
[bash: if, case] 문자열 비교 조건에 정규표현식 사용 (0) | 2023.06.28 |
[bash: expect] 다중 사용자 환경에서 보안을 강화한 작업 자동화 (0) | 2023.06.20 |