Jak podzielić duży plik tekstowy w linuksie i OS X

Systemy operacyjne
Jak podzielić duży plik tekstowy w linuksie i OS X

Przeważnie z dużymi plikami tekstowymi spotykam się, gdy chcę przejrzeć logi aplikacji w której wystąpił błąd. Niestety nie zawsze programista, który ją tworzył zadbał o dzielenie pliku z logami przez co te potrafią urosnąć do niebotycznych rozmiarów. Jak sobie z nimi poradzić ?

Załóżmy, że mamy taki przypadek jak poniżej:

Są tutaj pliki logów podzielone ze względu na rok, miesiąc, dzień i jest to idealny przypadek. Pliki są małe i swobodnie możemy je przeglądać, jednak pliki dev.log oraz prod.log nie są już tak przyjemne do analizy. Pomijając już aspekt przeszukiwania takich logów to część edytorów tekstu nie będzie chciała ich otworzyć ze względu na rozmiar. Dlatego potrzebujemy takie pliki podzielić na mniejsze.

split

Najprostszym rozwiązaniem jest użycie polecenia split z poziomu konsoli. Występuje ono w niemal każdym linuksie oraz Mac OS X, niestety systemy Windows nie posiadają tego polecenia i konieczne jest wykorzystanie dodatkowych aplikacji. Przejdźmy jednak do tego jak możemy wykorzystać polecenie split.

podział pliku ze względu na rozmiar

Zaczniemy od podzielenia pliku na równe części po 10 megabajtów, do tego celu posłużymy się poleceniem:

split -b 10m prod.log

Flaga -b mówi aplikacji, że chcemy podzielić plik na określoną ilość bajtów. Rezultatem działania będzie wygenerowanie poniższej listy plików:

podział pliku ze względu na ilość linii

Kolejny rodzaj podziału to podział ze względu na ilość linii jaka ma się znaleźć w pliku. Załóżmy że chcemy mieć po 1000 linii w jednym pliku, w tym celu posłużymy się poleceniem:

split -l 1000 prod.log

Zastosowaliśmy tutaj flagę -l, która mówi aplikacji ile linii ma zawierać wynikowy plik. Jako że plik jest duży, a liczba linii stosunkowo mała w związku z czym zostało wygenerowanych 98 plików, więc pominę wstawianie zdjęcia 😉

podział pliku na określoną ilość części

Ostatnim sposobem podziału jakim chciałbym wam pokazać to podział na określoną ilość części. Niestety w systemie OS X ten sposób jest niedostępny ze względu na występowanie tam starszej wersji polecenia. Zanim przejdziemy do przykładów przyjrzyjmy się składni, gdyż w tym przypadku potrafi być ona nieco bardziej skomplikowana:

split -n CHUNKS file_name

gdzie CHUNKS może przyjmować wartości:

N       split into N files based on size of input
K/N     output Kth of N to stdout
l/N     split into N files without splitting lines
l/K/N   output Kth of N to stdout without splitting lines
r/N     like `l' but use round robin distribution
r/K/N   likewise but only output Kth of N to stdout

Najprostsza jest pierwsza opcja, czyli parametr N bazujący na rozmiarze. Podstawiając za N liczbę otrzymamy taką ilość plików, tak więc polecenie dzielące nasz wzorcowy plik na dwa będzie wyglądało następująco:

split -n 2 prod.log

W rezultacie powstały dwa pliki, co do pozostałych sposobów podziału to zachęcam do eksperymentów.

Przedstawione tutaj podstawy powinny być wystarczające, aby podzielić większość plików tekstowych na mniejsze zgodnie z naszymi potrzebami. Jednak jeśli macie jakiś bardziej złożony problem zapraszam do podzielenia się nim w komentarzach na pewno znajdziemy jakieś rozwiązanie 🙂