[bash: awk] 특정 위치(field)에 대한 문자열 검색 리눅스 bash script

행 전체가 아니라 특정한 위치(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() 함수에 적용했다.

awk 활용에 대한 다른 게시물들은 여기로


 

핑백

  • 반달가면 : [bash: awk] 조건에 따른 문자열 작업 2016-11-17 01:03:06 #

    ... 째 필드에 "123" 문자열이 있는 경우에만 행 전체를 출력하고 그렇지 않은 경우에 첫번째 필드만 출력한다면 아래와 같이 될 것이다. (특정 필드에 대한 검색을 다룬 이전 게시물에서 else만 추가된 모양새) awk '{ if ($2=="123") { print $0 } else { print $1 } &nbs ... more

  • 반달가면 : [bash: awk] 특정 위치(field)에 대한 정규표현식 문자열 검색 2017-04-11 20:21:38 #

    ... awk에서 특정한 위치(field)에 대하여 문자열을 검색하는 방법은 이전에도 정리해 둔 바가 있지만(여기로), 정규표현식(regular expression)으로 검색할 수 있는 훌륭한 방법이 있어서 이것도 정리해 두기로. 예를 들어 my_data.txt 파일에서 3번 ... more

  • 반달가면 : [bash: awk] awk에서 필드 구분자를 지정할 때 "escape sequence" 관련 경고 메시지 발생 2017-10-19 21:26:54 #

    ... awk에서 -F 옵션을 이용해서 필드 구분자(field separator)를 지정할 수 있다. 일단 관련 내용은 이전 게시물을 참고하자. [bash: awk] 특정 위치(field)에 대한 문자열 검색 [bash: awk] 여러 종류의 단어 구분자를 지정해서 단어 선택하기 알파벳이나 수자 등을 필드 구분자로 사용할 때는 크게 문제가 ... more

  • 반달가면 : [bash: awk] 항목의 합계를 계산할 때 예외 처리 2018-11-09 23:07:30 #

    ... END { print res }' 12 물론 grep을 사용하지 않고 awk 안에서도 특정 항목을 걸러낼 수 있겠지만(이에 대한 자세한 내용은 이전 게시물을 참고하자. 여기로), 합계를 구하기 전에 뭔가 앞쪽에 이것 저것 복잡한 작업이 있고 그 중간에 grep이 포함될 수도 있으므로 상황에 따라 위의 예시가 유효할 수 있다. 사과에 ... more

덧글

  • 2017/11/09 17:44 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 반달가면 2017/11/10 17:19 #

    두번째 단어에 특정 단어가 있을 경우 첫번째 단어를 나란히 정렬하고 싶다면 아래와 같이 해 볼 수 있을 듯하네요.

    awk '$2 ~ /IN000/ { print $1 }' my_file.txt | tr 'n' ' '

    my_file.txt에서 두번째 단어($2)에 "IN000"이 있으면 첫번째 단어( $1)를 출력하고, tr을 이용해서 줄바꿈을 공백으로 바꿨습니다.

    tr에 대한 내용은 아래의 링크를 참고하시기 바랍니다.

    http://bahndal.egloos.com/547759
  • :) 2017/11/25 13:48 # 삭제 답글

    잘 봤어요!
    중간에
    "awk -F ':' '{ if ($2==12345") print $0 }' test2.txt" 여기서 12345 앞에 " 부호가 하나 빠져있어요.
  • 반달가면 2017/11/25 20:57 #

    아 그렇군요. 수정했습니다. 감사합니다~
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

605300
3990
1845249

ad_widget_2