Polecenie cut w systemie Linux
W systemie Unix -podobnie jak systemy operacyjne, polecenie cut usuwa („wycina”) sekcje każdej linii pliku lub plików.
Ten dokument dotyczy wersji cut dla GNU / Linuksa.
Składnia
cut OPTION... ...
Opcje
-b, –bytes = LISTA | Wybierz tylko bajty z każdego wiersza, jak określono w LISTA. LISTA określa bajt, zestaw bajtów lub zakres bajtów; zobacz Określanie LISTY poniżej. |
-c, –characters = LISTA | Wybierz tylko znaki z każdej linii, jak określono w LISTA. LISTA określa znak, zestaw znaków lub zakres znaków; zobacz Określanie LISTY poniżej. |
-d, –delimiter = DELIM | użyj znaku DELIM zamiast tabulatora jako separatora pola. |
-f, –fields = LISTA | wybierz tylko te pola w każdej linii; wypisuje również każdą linię, która nie zawiera separatora, chyba że podano opcję -s. LISTA określa pole, zestaw pól lub zakres pól; zobacz Określanie LISTY poniżej. |
-n | Ta opcja jest ignorowana, ale została uwzględniona ze względu na kompatybilność. |
–complement | uzupełnia zestaw wybranych bajtów, znaków lub pól. |
-s, –only-delimited | nie drukuj wierszy niezawierających separatorów. |
–output-delimiter = ŁAŃCUCH | użyj ŁAŃCUCHA jako łańcucha separatora wyjścia. Domyślnie używany jest separator danych wejściowych. |
–help | Wyświetl komunikat pomocy i zakończ. |
–version | wyświetla informacje o wersji i kończy działanie. |
Uwagi dotyczące użytkowania
Wywołując cut, użyj opcji -b, -c lub -f, ale tylko jednej z nich.
Jeśli nie podano PLIKU, cut czyta ze standardowego wejścia.
Określanie LISTY
Każda LISTA składa się z liczby całkowitej, zakresu liczb całkowitych lub wielu zakresów liczb całkowitych oddzielonych przecinkami. Wybrane wejście jest zapisywane w tej samej kolejności, w jakiej jest odczytywane, i zapisywane na wyjściu dokładnie raz. Zakres składa się z:
Na przykład, powiedzmy, że masz plik o nazwie data.txt, który zawiera następujący tekst:
onetwothreefourfivealphabetagammadeltaepsilon
W tym przykładzie każde z tych słów jest oddzielone znakiem tabulacji, a nie spacjami. Znak tabulacji jest domyślnym ogranicznikiem wycięcia, więc domyślnie będzie traktować pole jako wszystko rozdzielone tabulatorem.
Aby „wyciąć” tylko trzecie pole każdego wiersza, użyj polecenia:
cut -f 3 data.txt
… co da wynik:
threegamma
Jeśli zamiast tego chcesz „wyciąć” tylko pola od drugiej do czwartej każdego wiersza, użyj polecenia:
cut -f 2-4 data.txt
… co zwróci następujący wynik:
twothreefourbetagammadelta
Jeśli chcesz” wyciąć „tylko pierwszy-do- drugie i od czwartego do piątego pola każdego wiersza (pomijając trzecie pole), użyj polecenia:
cut -f 1-2,4-5 data.txt
… które wyświetli:
onetwofourfivealphabetadeltaepsilon
Albo powiedzmy chcesz trzecie pole i każde pole po nim, pomijając pierwsze dwa pola. W tym przypadku możesz użyć polecenia:
cut -f 3- data.txt
…, które wyświetli:
threefourfivegammadeltaepsilon
Określenie zakresu za pomocą LISTA dotyczy również wycinania znaków (-c) lub bajtów (-b) z wiersza. Na przykład, aby wypisać tylko znak od trzeciej do dwunastej w każdym wierszu danych.txt, użyj polecenia:
cut -c 3-12 data.txt
… które wyświetli następujące:
etwothrephabetag
Pamiętaj, że „spacja” między każdym słowem to w rzeczywistości pojedynczy znak tabulacji, więc w obu wierszach wyniku jest wyświetlanych dziesięć znaków: osiem znaki alfanumeryczne i dwa znaki tabulacji. Innymi słowy, cut pomija pierwsze dwa znaki w każdym wierszu, licząc tabulatory jako jeden znak; wypisywanie znaków od trzech do dwunastu, licząc tabulatory jako jeden znak; i pomijanie jakichkolwiek znaków po dwunastej.
Liczenie bajtów zamiast znaków da w tym przypadku taki sam wynik, ponieważ w pliku tekstowym zakodowanym w ASCII każdy znak jest reprezentowany przez jeden bajt (osiem bitów ) danych. Zatem polecenie:
cut -b 3-12 data.txt
… da dla naszego pliku data.txt dokładnie to samo wyjście:
etwothrephabetag
Określanie separatora innego niż tabulator
Znak tabulatora jest domyślnym separatorem używanym przez cut do określenia, co stanowi pole. Tak więc, jeśli pola twojego pliku są już rozdzielone tabulatorami, nie musisz określać innego znaku separatora.
Możesz jednak określić dowolny znak jako separator.Na przykład plik / etc / passwd zawiera informacje o każdym użytkowniku w systemie, o jednym użytkowniku w każdym wierszu, a każde pole informacyjne jest oddzielone dwukropkiem („:”). Na przykład wiersz / etc / passwd dla użytkownika root może wyglądać następująco:
root:x:0:0:root:/root:/bin/bash
Te pola zawierają następujące informacje w następującej kolejności: oddzielone dwukropkiem:
- Nazwa użytkownika
- Hasło (wyświetlane jako x, jeśli jest zaszyfrowane)
- Numer ID użytkownika (UID)
- Numer ID grupy (GID)
- Pole komentarza (używane przez polecenie finger)
- Katalog domowy
- Shell
Nazwa użytkownika to pierwsze pole w wierszu, więc aby wyświetlić każdą nazwę użytkownika w systemie, użyj polecenia:
cut -f 1 -d ":" /etc/passwd
… które wyświetli , na przykład:
rootdaemonbinsyschope
(W typowym systemie jest dużo więcej kont użytkowników, w tym wiele kont specyficznych dla usług systemowych, ale w tym przykładzie będziemy udawać jest tylko pięciu użytkowników.)
Trzecie pole każdej linii w pliku / etc / passwd to UID (numer ID użytkownika), więc aby wyświetlić każdą nazwę użytkownika i numer ID użytkownika, użyj polecenia:
… co wyświetli na przykład:
root:0daemon:1bin:2sys:3chope:1000
Jak widać, wynik będzie rozdzielany, domyślnie, przy użyciu tego samego separatora określonego dla danych wejściowych. W tym przypadku jest to znak dwukropka („:”). Możesz jednak określić inny separator dla danych wejściowych i wyjściowych. Tak więc, jeśli chcesz uruchomić poprzednie polecenie, ale wynik jest oddzielony spacją, możesz użyć polecenia:
cut -f 1,3 -d ":" --output-delimiter=" " /etc/passwd
root 0daemon 1bin 2sys 3chope 1000
Ale co, jeśli chcesz, aby wyjście było oddzielone tabulatorem ? Określenie znaku tabulatora w linii poleceń jest nieco bardziej skomplikowane, ponieważ jest to znak niedrukowalny. Aby określić go w wierszu poleceń, musisz go „zabezpieczyć” przed powłoką. Robi się to inaczej w zależności od tego, którą powłokę używasz. ponownie, ale w domyślnej powłoce Linuksa (bash) możesz określić znak tabulacji za pomocą $ „\ t”. Zatem polecenie:
cut -f 1,3 -d ":" --output-delimiter=$"\t" /etc/passwd
… wyświetli następujący wynik, na przykład:
root0daemon1bin2sys3chope1000
Przykłady
cut -c 3 file.txt
Wyświetla trzeci znak każdej linii pliku file.txt, pomijając pozostałe.
cut -c 1-3 file.txt
Wypisz pierwsze trzy znaki każdej linii pliku file.txt, pomijając resztę.
cut -c -3 file.txt
To samo co powyższe polecenie. Wypisz pierwsze trzy znaki każdego wiersza pliku file.txt.
cut -c 3- file.txt
Wypisz od trzeciego do ostatnich znaków każdego wiersza pliku file.txt, pomijając pierwsze dwa znaki.
cut -d ":" -f 1 /etc/passwd
Wyświetla pierwsze pole pliku / etc / passwd, gdzie pola są rozdzielane dwukropkami („:”). Pierwsze pole / etc / passwd to nazwa użytkownika, więc to polecenie wyświetli każdą nazwę użytkownika w pliku passwd.
grep "/bin/bash" /etc/passwd | cut -d ":" -f 1,6
Wypisz pierwsze i szóste pola, oddzielony dwukropkiem dowolnego wpisu w pliku / etc / passwd, który określa / bin / bash jako powłokę logowania. To polecenie wyświetli nazwę użytkownika i katalog domowy każdego użytkownika, którego powłoką logowania jest / bin / bash.