[bash: sed] 대용량 파일에서 특정 위치의 행만 출력하기 리눅스 bash script

파일에서 특정한 행을 출력하기 위해서 sed 명령을 활용하게 되는데, 통상 아래의 예시와 같은 형태로 쓰게 된다.

# my_data.txt 파일에서 124번째 행을 출력
sed -n 124p my_data.txt

# my_data.txt 파일에서 100번째 행부터 110번째 행까지 출력
sed -n 100,110p my_data.txt

파일 용량이 별로 크지 않으면 위와 같은 형태로도 별 문제가 없다. 그러나 수백MB 이상의 대용량 파일에서 특정 부분을 출력해야 하는 경우에, 특히 이런 작업을 여러번 반복해야 하는 경우에는 상당한 시간이 걸릴 수 있다.

예를 들어 500MB 파일에서 100번째 행만 출력하는 상황이라도, sed는 파일을 처음부터 끝까지 다 읽은 후에 작업을 종료하기 때문이다. 그러므로, 파일 크기가 클 때는 출력하고자 하는 행에 도달하면 출력을 하고 그대로 종료하도록 하면 훨씬 효율적이다. 아래의 예시를 보자.

# my_big_data.txt 파일에서 124번째 행을 출력
sed -n "124{p;q;}" my_big_data.txt

위와 같이 sed의 행번호 지정 부분에서 "p" 대신에 "{p;q;}" 이렇게 하면 해당되는 행을 출력한 후 파일을 끝까지 읽지 않고 곧바로 프로세스를 종료한다. 리눅스 shell에서 세미콜론(;)이 해석되지 말아야 하므로 해당 인자를 반드시 따옴표로 묶어준다는 점에 유의.

출력 범위를 지정할 경우에는 아래와 같이 한다.

# my_big_data.txt 파일에서 100번째 행부터 110번째 행까지 출력
sed -n "100,110p;110q;" my_big_data.txt

100번째 행부터 110번째 행까지 출력(100,110p;)한 후에 100번째 행에서 종료(110q;)하게 된다.

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


 

핑백

덧글

  • ㅠㅠ 2018/02/25 11:10 # 삭제 답글

    왜 저는 sed -n "100,110{p;q;}" my_big_data.txt 하면 100번째 줄만 나오고 말까요 ㅠㅠ
  • ㅠㅠ 2018/02/25 11:27 # 삭제

    찾아보니 전 아래와 같이 하니 되는 것 같네요.

    sed -n '45,50p' filename # print line nos. 45-50 of a file
    sed -n '51q;45,50p' filename # same, but executes much faster
  • 반달가면 2018/02/26 08:42 #

    아 네. 맞습니다. 제가 착각했네요. 범위를 지정해서 출력할 경우에는 어느 행에서 종료할 것인지 명시적으로 지정해 주어야 합니다.

    게시물 내용을 수정하였습니다. 감사합니다.
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

629349
4728
1719424

ad_widget_2