스크립트

포스트: 84
Tags

Posts

84 posts

[bash: awk] awk에서 외부 명령을 실행하고 결과를 변수에 저장하기

반달가면|2016년 12월 20일

awk에서 문자열 작업을 할 때 외부 프로그램을 실행하는 방법이다. awk 자체적으로도 제공하는 다양한 함수 외에 외부 명령을 필요로 하는 상황에서 아주 요긴하다. 예시를 하나 생각해 보자. my_data.txt 파일을 읽어서 한 행마다 MD5 해쉬값을 구해야 하는 경우다. awk에는 MD5 해쉬를 계산해 주는 함수가 없으므로 리눅스에서 제공하는 md5sum을 이용해야 한다. 먼저 md5sum 예시를 보자면 아래와 같다. # 문자열 abc의 MD5해쉬값 계산 echo "abc" | md5sum 0bee89b07a248e27c83fc3d5951213c1 - md5sum의 출력이 "[MD5해쉬값] - [파일명]" 형태이므로 해쉬값만 취하려면 cut을 이용해서 -c 옵션으로 아래와 같이 앞쪽

[bash: awk] 특정 위치(field)의 문자열에서 특정 길이 만큼 문자열 추출

반달가면|2016년 12월 16일

awk에서도 expr의 substr 옵션과 같은 기능을 하는 함수가 존재한다. 이름도 substr로 같다. (expr의 substr 옵션에 대한 내용은 이전 게시물을 참고하자. 여기로) substr 함수의 형식은 아래와 같다. 아래의 형식에서 문자열이 들어갈 자리에 $1, $2 등 위치(field) 변수를 지정해 주면 된다. substr("문자열",[시작 위치],[길이]) 간단한 예시를 보자. 문자열 "I'm a student"에서 세번째 단어(student)의 2번째 바이트부터 4바이트를 추출하고자 한다면 아래와 같이 될 것이다. substr 함수를 이용해서 3번째 단어의 2번째 바이트부터 4바이트를 추출하여 변수 result에 저장하고 print 명령으로 출력. echo "I'm a

[bash: while, read, <] 텍스트 파일을 한줄씩 읽어서 작업하기

반달가면|2016년 12월 14일

텍스트 파일을 한줄씩 읽어서 순차적으로 작업을 해야 할 경우, while과 read 명령을 조합하고 I/O 리다이렉션(redirection)으로 파일을 열어 주면 된다. 예시를 보면 금방 감을 잡을 수 있을 것이다. 예를 들어 my_data.txt 파일을 한줄씩 읽어서 행번호와 함께 출력하는 경우를 생각해 보자. 아래와 같은 형태가 될 것이다. # 행번호 초기값 설정 line_num=1 # 파일에 대한 작업 while read -r rline do # 행번호와 read 명령으로 읽은 행 출력 echo "$line_num : $rline" # 행번호 1 증가 ((line_num++)) done < my_data.txt 행번호는 변수 line_num에, 파일로

[bash: grep] 두개의 파일에서 공통으로 출현하는 문자열 찾기

반달가면|2016년 11월 30일

파일 2개를 비교해서 양쪽 파일에 공통적으로 출현하는 문자열을 찾는 방법이다. grep의 -f 옵션을 사용하면 된다. -f 옵션은 검색할 문자열을 파일로부터 한줄씩 읽어들이기 위한 것이다. 예를 들어 a.txt 파일에 있는 문자열 중에 b.txt에도 있는지 알고 싶다면, 아래와 같이 해 볼 수 있다. # a.txt 파일로부터 문자열 패턴을 읽어서 b.txt에서 검색 (-f 옵션) grep -f a.txt b.txt 한가지 생각해 볼 점은, a.txt와 b.txt에 빈 줄이 많이 존재할 경우 이것도 전부 문자열로 간주해서 비교하기 때문에 빈 줄도 일치하는 것으로 결과가 나와서 보기에 지저분할 수 있다. 위의 예시를 좀 더 깔끔하게 작업하려면 a.txt 파일에서 빈 줄을 제거하고 중복되는 문자