DDD tactical components

Terminal Shortcut tmux cut jq screen split

linux에서 big file을 handling 할 때 사용하는 방법.

최근 split을 사용할 일들이 더 많아져서, 정리하고자 올린다.

linux에서 서버를 관리하다보면, 생각보다 큰 파일들을 관리해야할 일들이 많다.
내가 편리하게? 어쩌면 split 없이는 해결할 수 없는 문제들을 해결하기 위해 사용하는 커맨드를 정리한다.

문제가 됐던 파일

최근에 내가 확인한 파일은 아래와 같은 파일들이었다.

  1. 하나의 라인에 파일이 수십 GB 쓰여있는 파일.
  2. 수천만 ~ 수억 라인을 갖는 수십 GB 파일.

문제

내가 겪은 문제는..

  1. 큰 파일들은 load하기가 어려워서 vi로 수십 GB의 파일을 load하면 load가 되지 않는 경우가 많다.
    • 적당히 큰 파일들은 켜지지만 딜레이가 굉장히 컸다.
  2. 1번의 한 라인으로 쓰인 파일은 head로 일부를 확인할 수도 없다.
    • head가 line을 출력하니까.. head시 수십 GB를 print하는 상황
    • cut으로 일부 출력이 가능하지만, 포맷을 모르는 한 라인은 무작정 cut을 할수도 없고 시간이 오래걸림
  3. 2번의 여러 라인의 파일은 diff, uniq 같은 커맨드에 대해 process가 kill 되어 버린다. (손을 쓸 수 없다)

split 사용 사례

위와 같은 문제를 해결하기 위해 아래와 같이 사용했다.

  1. data를 확인하기 위해 파일을 열어봐야 하는 상황이었다.
    • file을 split으로 byte 단위로 나누어 열어볼 수 있게 작게 나눴다.
  2. data를 diff해야 하는 상황이었다.
    • 그 외 다른 커맨드나 python 등의 작업에서 로드시 메모리 문제가 없게하기 위해서도 사용할 수 있다.
    • file을 split으로 line 단위로 나누어 작업하였다.

split 사용 방법

byte 단위로 나누기

split -b 100MB sourcefile

이렇게하면 100MB 단위로 파일을 나눌 수 있다.
개인적으로 100MB 정도면.. 파일을 편하게 열어볼 수 있겠더라.

  • instance의 cpu, mem 사양마다 다를 것.
  • diff등의 작업에서는 더 크게 1~10GB로 작업했다.

위 1번 문제처럼 파일이 라인 단위가 아닐 때 byte 단위로 나누면 좋지 싶다.

line 단위로 나누기

split -l 1000000 sourcefile

이렇게하면 1000000 라인 단위로 파일을 나눌 수 있다.

target file 적용하기

split -b 100MB sourcefile targetfile

위 예제에서 targetfile이 없을 경우, targetfile의 name은 xaa, xab … 같은 식이다.
targetfile을 명시해주면, targetfileaa, targetfileab … 같은 식이 된다.

targetfile suffix

split -d -l 100 sourcefile

-d option을 적용하면 alphabet suffix가 numeric으로 바뀐다.
before: targetfile의 name은 xaa, xab
after: targetfile의 name은 x01, x02

reference