Linux Commands
linux에서 big file을 handling 할 때 사용하는 방법.
최근 split
을 사용할 일들이 더 많아져서, 정리하고자 올린다.
linux에서 서버를 관리하다보면, 생각보다 큰 파일들을 관리해야할 일들이 많다.
내가 편리하게? 어쩌면 split
없이는 해결할 수 없는 문제들을 해결하기 위해 사용하는 커맨드를 정리한다.
문제가 됐던 파일
최근에 내가 확인한 파일은 아래와 같은 파일들이었다.
- 하나의 라인에 파일이 수십 GB 쓰여있는 파일.
- 수천만 ~ 수억 라인을 갖는 수십 GB 파일.
문제
내가 겪은 문제는..
- 큰 파일들은 load하기가 어려워서 vi로 수십 GB의 파일을 load하면 load가 되지 않는 경우가 많다.
- 적당히 큰 파일들은 켜지지만 딜레이가 굉장히 컸다.
- 1번의 한 라인으로 쓰인 파일은 head로 일부를 확인할 수도 없다.
- head가 line을 출력하니까.. head시 수십 GB를 print하는 상황
- cut으로 일부 출력이 가능하지만, 포맷을 모르는 한 라인은 무작정 cut을 할수도 없고 시간이 오래걸림
- 2번의 여러 라인의 파일은 diff, uniq 같은 커맨드에 대해 process가 kill 되어 버린다. (손을 쓸 수 없다)
split 사용 사례
위와 같은 문제를 해결하기 위해 아래와 같이 사용했다.
- data를 확인하기 위해 파일을 열어봐야 하는 상황이었다.
- file을 split으로 byte 단위로 나누어 열어볼 수 있게 작게 나눴다.
- 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
…