bash script2023. 6. 29. 12:18

 

반달가면 이글루에서 백업 - 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() 함수에 적용했다.

 

 

728x90
Posted by 반달가면