CodeGym /Kursy /Docker SELF /Sortowanie i filtrowanie plików: komendy `sort`, `uniq`, ...

Sortowanie i filtrowanie plików: komendy `sort`, `uniq`, `cut`

Docker SELF
Poziom 8 , Lekcja 3
Dostępny

Sortowanie i filtrowanie plików: komendy sort, uniq, cut

1. Komenda sort

Komenda sort jest przeznaczona do sortowania linii w pliku tekstowym. Działa z dowolnym formatem tekstu: od zwykłego płaskiego tekstu do CSV. Domyślnie sortuje linie w porządku alfabetycznym. Jednak istnieje masa opcji, które pozwolą ci dokonywać prawdziwych cudów.

Podstawowa składnia

sort [opcje] plik

Prosty przykład

Załóżmy, że mamy plik names.txt z następującą zawartością:

Charlie
Alice
Bob
David

Możemy go posortować alfabetycznie tak:

sort names.txt

Wynik:

Alice
Bob
Charlie
David

Kluczowe opcje sort

Sortowanie w odwrotnej kolejności

Jeśli chcesz posortować linie w kolejności malejącej, użyj opcji -r:

sort -r names.txt

Wynik:

David
Charlie
Bob
Alice

Sortowanie numeryczne

Dla liczb sortowanie alfabetyczne może działać niepoprawnie. Na przykład, oto zawartość pliku numbers.txt:

10
2
5
1

Sortowanie alfabetyczne zwróci:

1
10
2
5

Ale z opcją -n (sortowanie numeryczne):

sort -n numbers.txt

Wynik będzie poprawny:

1
2
5
10

Odporność na spacje

Czasami linie zawierają spacje na początku lub końcu. Aby sort się nie mylił, użyj opcji -b:

sort -b brudny_plik.txt

Przykład

Załóżmy, że mamy dziennik odwiedzin strony internetowej visits.log:

user2 15
user1 5
user3 30
user4 20

Chcemy posortować użytkowników według liczby odwiedzin (druga kolumna). Robimy to tak:

sort -k2 -n visits.log

Gdzie -k2 oznacza "użyj drugiej kolumny do sortowania". Wynik:

user1 5
user2 15
user4 20
user3 30

2. Komenda uniq

Komenda uniq usuwa powtarzające się wiersze w pliku. Ale ważne jest, aby pamiętać: działa tylko na kolejnych duplikatach. Oznacza to, że jeśli identyczne linie występują w różnych częściach pliku, najpierw trzeba je posortować.

Podstawowa składnia

uniq [opcje] plik

Prosty przykład

Załóżmy, że mamy plik colors.txt:

red
green
green
blue
blue
blue
red

Jeśli po prostu użyjemy uniq:

uniq colors.txt

Wynik będzie:

red
green
blue
red

Usuwanie nieuniknionych duplikatów

Najpierw posortuj plik:

sort colors.txt | uniq

Wynik:

blue
green
red

Kluczowe opcje uniq

Zliczanie powtórzeń

Jeśli chcesz wiedzieć, ile razy każdy wiersz wystąpił, użyj opcji -c:

sort colors.txt | uniq -c

Wynik:

   3 blue
   2 green
   2 red

Przykład

W pliku access.log mamy listę adresów IP:

192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1

Chcemy wiedzieć, który IP występował najczęściej:

sort access.log | uniq -c | sort -rn

Wynik:

   3 192.168.0.1
   1 192.168.0.2
   1 192.168.0.3

3. Polecenie cut

Polecenie cut pozwala na wyciąganie określonych części wierszy, na przykład pojedynczych kolumn w pliku CSV lub zakresów znaków.

Podstawowa składnia

cut [opcje] plik

Prosty przykład

Plik data.csv:

Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager

Wyciągniemy tylko imiona (pierwsza kolumna):

cut -d',' -f1 data.csv

Wynik:

Alice
Bob
Charlie

Gdzie:

  • -d',' — separator (przecinek).
  • -f1 — pole (kolumna) do wyciągnięcia.

Kluczowe opcje cut

Wybór zakresu znaków

Jeżeli nasz plik data.csv składa się z kolumn o stałej szerokości:

Alice      25 Developer
Bob        30 Designer
Charlie    22 Manager

Możemy wyciągnąć jedynie wiek (znaki od 12 do 14):

cut -c12-14 data.csv

Wynik:

25
30
22

Wybór wielu pól

Jeśli mamy plik log.csv:

2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped

Wybierzmy tylko datę i poziom logów (pola 1 i 2):

cut -d',' -f1,2 log.csv

Wynik:

2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO

4. Przykład praktyczny: Łączenie sort, uniq i cut

Weźmy plik log z takimi danymi:

user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
  1. Wyciągniemy adresy IP:
cut -d',' -f2 log.txt
  1. Usuńmy duplikaty i policzmy je:
cut -d',' -f2 log.txt | sort | uniq -c
  1. Posortujmy według liczby wystąpień:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn

Wynik:

2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION