본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스 유닉스] 파일을 쪼개는 split 명령어 사용법. 큰 파일 작은 파일로 분할하기. split옵션으로 다양하게 파일 자르기, 자른파일 합치기

 

[리눅스 / 유닉스 완전정복 포스팅 링크] 

안녕하세요! 오랜만에 리눅스 포스팅이네요 ㅎㅎ

오늘은 명령어 split에 대해서 다뤄볼까 해요 ㅎㅎ

 

SPLIT - 파일쪼개는 명령어

SPLIT 필요한 상황 예시 가정해보기

어떤 프로세스나 데몬이 돌게 되면, 항상 뭔가 발자취를 남기겠죠! 

로그를 남겨야 프로그램이 잘 돌았는지 상태를 확인할 수 있는 방법이 되기도 하고,

로그로부터 특정 데이터를 추출한다던가 할 수도 있을테니까요.

 

한 예로, 파일시스템이 80프로가 넘게 차있으면, 자동으로 이를 인지하고 파일들을 삭제해주는 데몬이 있다고 합시다. 이 데몬이 돌면, 어떤 파일들을 삭제했는지 로그를 남겨야, 나중에 우리가 언제 몇시에 어떤 상황에 어떤 목록들을 삭제했는지 알 수 있겠죠?

 

또는 어떤 거래가 들어와 서버의 서비스를 타게 되면 해당 로그들이 있어야 나중에 분석할 수 있을거예요!

송금만 하더라도 그 내역이 쌓여야 나중에 내가 누구한테 송금했는지 찾을 수 있죠!

 

로그는 보통 일자별로, 또는 일자+시간으로 조합해서 생성되게 코드를 짜는 경우가 많은데, 만약 새로운 거래가 들어올때마다 로그가 덮여쓰여진다면 이전 기록은 사라져 찾기 어려울거예요. 그래서 로그는 대게 맨 뒤에 이어 덧붙여지는 방식으로 남기게 하는 경우가 다수입니다. ㅎㅎ

 

그럼 시간이 지나 데몬이 계속 돌수록 로그 파일도 커지겠죠!

유닉스 리눅스 같은 경우, 파일이 일정 크기를 넘겨서 매우 커지면 vi 편집기로 파일을 여는게 에러가 뜬답니다. ㅎㅎ

또 뭔가를 서칭하게 될 경우, 파일이 너무 커서 찾는데 오래걸릴 수 있어요.

최근에 돌았다면, SPLIT로 파일을 분할한 후 마지막 파일에서만 검색하면 되겠죠 ㅎㅎ

 

그 외에도 상황은 다양한데, 파일이 너무 클 경우, 해당 파일을 vi로 연 후 에디터로 복붙하면 에디터가 뻗는 경우가 많이 있어요 ㅎㅎ 물론 다양한 해결법이 있지만, split도 하나의 해결책이 될 수 있죠 ㅎㅎ

 

암튼 결론, 로그가 계속 쌓여 커지는 환경에서 파일을 분리해주는 SPLIT 명령어는 유용하다는거!

실습 전 준비

SPLIT가 파일 쪼개는 명령어이니만큼, 대용량의 파일이 준비되어 있어야겠죠.

혹 기존에 연습삼아 사용할만한 파일이 있으면 좋겠지만 그렇지 않을 경우, 임시 더미 파일을 생성해야해요.

 

그 부분은 아래 포스팅을 참고해주세요!

불러오는 중입니다...

 

저는 마침 엄청 크기가 큰 파일이 있어, 이를 기반으로 테스트해볼게요

서버명, 그룹명, 계정명은 가렸어요 ㅎㅎ 

파일 크기가 무려 13747395586이네요..

128기가가 넘는 파일이예요!

SPLIT 사용 방법

1. 기본 사용법 

split test.log20200217

기본 사용법은 split 이후에 파일명을 써주면 됩니다. 이러면 기본적으로 1000줄단위로 파일이 잘라서 나눠지게 됩니다.

split명령어 수행 후 ls로 파일목록 보기 했을 때 

아무런 옵션없이 사용하게 되면, 1000줄 기준으로 쪼갠뒤 파일명을 x로 시작하는 3글자로 해서 만들어줘요. 네이밍은 알파벳이 기본이예요

기본 명령어 split 사용 후 

원본 파일은 사라지지 않습니다. 빨간색 밑줄 그어져 있는 부분 보면 그대로 남아있죠?ㅎㅎ 

근데 저의 경우, 파일 용량이 너무 커서 676개까지 만들어지고 그 다음엔 중지됐네요ㅎㅎ 1000을 기준으로 쪼개니까 파일이 너무 많아요. 파일을 1000라인 단위가 아닌 기준을 더 크게 잡고 싶을 때가 많겠죠? 특정 라인의 개수 기준으로 쪼개개 할 수도 있고, 특정 크기를 가지는 파일들로 쪼개개 할 수도 있습니다. 

 

<SPLIT OPTIONS>

split 명령어 옵션들

위는 man 명령어로 기본 AIX 운영체제의 split 옵션을 확인한 결과입니다.

AIX의 split는 a, b, l 옵션을 가지고 있네요. 각 내용은 아래와 같아요 

 

a: 접미사의 길이를 지정하는 옵션, 

b: 파일을 바이트 크기 단위로 분할하는 옵션

l: 특정 라인의 파일들로 분할하는 옵션

 

2. 바이트 기준으로 분할하기 (b옵션, 크기 기준)

split -b 크기 파일명

파일을 줄 수가 아닌 특정 크기만큼 분할하고 싶을 경우, b옵션을 사용하면 됩니다.

split -b 1000000000 test.log20200207

해당 파일을 대상으로 1000000000단위로 파일을 나누게 해봤어요 ㅎㅎ

파일이 총 14개로 쪼개졌네요 ㅎㅎ  목록을 보여주는  ls명령어에 -l 옵션을 붙이면 각 파일별 용량 크기를 알 수 있습니다. 역시 원본파일은 남아있습니다.

 

3. 분할 파일명 붙이기 (접두사 지정하기)

xab 이런식으로 파일명이 생성되니까 어떤 파일을 쪼갰는지 보기도 어렵고.. 파일명도 맘에 안들죠 ㅎㅎㅎ

알아보기 쉽게 파일명을 앞에 기본으로 fix해보도록 해요.

split 분할대상파일명 분할파일명접두사
split test.log20200217 test.log20200217_

저는 접두어를 기존파일명으로 지정했습니다. 

접두어를 이렇게 붙여줬을 경우, x부터 시작하는 파일 명이 아니라 '접두어+a로 시작하는 알파벳 두자리' 이렇게 파일이 쪼개지게 됩니다. 접두어를 붙이게 되면서 이떤 파일이 분할된 결과인지 알아보기 쉬워졌어요 ㅎㅎ

4. 파일 크기별로 분할하기

2번에서 바이트 기준으로 파일을 나눴는데,, 파일이 너무 크다보니 0이 몇개인지,, 실수할 확률이 너무 크죠?

바이트 외에도 키로바이트, 메가바이트 단위를 기준으로 파일 분할이 가능해요 

split -b 1k 파일명

//KB 킬로바이트
split -b 1000000k test.log20200217

//MB 메가바이트
split -b 1000m test.log20200217

1000000k 크기를 갖도록 파일을 분할했어요 ㅎㅎ 파일을 알아보기 파일명에 뒤에 '_'를 붙인 값을 접두어로 지정해주었습니다. 

k단위 사용

이번엔 m를 사용해서 분할했어요. 결과 사진을 보면, 1048576000바이트 파일로 분할된 것을 확인할 수 있어요 ㅎㅎ 1메가가 1048576이므로 알맞게 잘 분할되었네요 

1000메가바이트 단위로 파일 분할

AIX에서 키로바이트랑 메가바이트 단위로 분할은 되는데 기가바이트 단위는 안되네요 ㅎㅎ

1g로 분할시도 

1g외에 1G, 1gb등 다양한 방법으로 기가바이트 분할이 되나 시도해봤는데 실패...

옵션은 운영체제에 따라 다를 수 있다는거 아시죠?ㅎㅎ

5. l 옵션으로 라인단위로 파일 자르기. (줄 수 기준 = 행 기준)

 대상 파일이 몇 라인을 가지고 있는지 먼저 확인을 해야 어떻게 나눌지 계획할 수 있겠죠?

wc -l 파일명

wc명령어는 아래 포스팅을 참조해주세요 :)

 

[리눅스/유닉스/셸 프로그래밍] 파일 행 단어 등 총 개수를 출력해주는 wc 명령어

[ Linux / Unix / Shell programming 포스팅 목차 링크 모음 ] 안녕하세요 여러분! 오늘은 명령어 wc에 대해서 알아보는 시간을 가집시다.ㅎㅎ 사실 요 아이도 대게 간단한 명령어예요. 바로 시작할까요? 명령어..

jhnyang.tistory.com

대상이 되는 파일의 라인수 

우리가 분할할 파일은 190,061,131의 행을 가지고 있네요 ㅎㅎ 

split -l 10000000 test.log20200217

각각의 파일이 10000000 라인을 갖도록 분할해줬습니다.

ls 옵션으로 확인해보니 여러 파일들이 생성된 것을 확인할 수 있습니다. 비슷한 바이트 크기를 가지는거보니 라인수가 비슷비슷할것 같긴한대, wc 명령어로 좀 더 확실히 확인해봅시다.

동일한 라인의 파일들과 나머지 파일 이렇게 잘 분할된 것을 확인할 수 있어요 ㅎㅎ

 

6. 접미사 길이를 지정해주는 a옵션

분할되는 파일 뒤에 붙을 길이를 지정해줍니다.

예를 들어 -a 2하면 aa ab ac ad 이렇게 두자리씩 붙는데 -a 3이렇게 하면 aaa aab aac 이런식으로 3자리씩 붙게 됩니다. 파일이 여러개로 분할될게 아니라면 1자리로 통일시켜주는게 보기엔 깔끔하겠죠 

7. 자른 파일 합치기

이렇게 분할한 파일을 합치는 방법도 필요할 경우가 있겠죠?

cat이라는 명령어를 이용해 간단하게 합칠 수 있어요

cat test.log20200217_* > test.log20200217.copy

원본파일과 합친 결과 파일과 크기가 동일한 것을 확인할 수 있어요

좀 더 정확한 비교를 위해 내용이 혹시 달라진점이 있는지 diff로 확인해봅시다.

diff test.log20200217 test.log20200217.copy

차이가 없음을 알 수 있습니당

실습결과파일

 

8. 백그라운드로 돌리기

이렇게 split로 분할하고 다시 분할된 파일을 하나로 합치는 작업은 파일이 크면 클수록 꽤 오래걸려요.

이런 작업들은 백그라운드로 돌려놓는게 훨씬 효율적이겠죠?

//백그라운드로 작업 돌리기
cat test.log20200217_* > test.log20200217.copy &
//백그라운드 작업 확인
jobs

 

오늘은 여기까지입니다. 도움되셨다면 공감 /댓글/ 광고보답은 우떤가요?ㅎㅎ 정보공유에 힘이됩니다 :)

  • 이성일 2020.07.16 17:18

    스플릿하고... 실수로 -b 1로 해서 엄청 많이나온 파일을 하나하나 삭제 했는데...

    뒤에 나오는 rm a_* 를 ... 알았더라면...