Wyciąć wybrane pola każdego wiersza pliku.
Składnia
cut [-b] [-c] [-f] lista [-n] [-d separatora [[-s]] plik]
list-b Poniższa lista określa bajt-b pozycji (na przykład-b1-72 przejdzie pierwszych 72
bajtów w każdej linii). Gdy-b-n i są używane razem, lista jest dostosowany tak, aby nie wielobajtowe charakter jest podzielona. -B, jeżeli jest używany, linii do wprowadzania danych powinny zawierać 1023 bajtów lub mniej.
list-c Poniższa lista-c określa charakter miejsca (np.-C1-72 przejdzie pierwszych 72 znaków w każdej linii).
-List f Poniższa lista-f znajduje się lista pól zakłada się, że w pliku oddzielone przez znak ogranicznika (zobacz-d), na przykład,-f1, 7 egzemplarzy pierwszego i siódmego pola tylko. Linii ograniczniki dziedzinie będzie przekazywana za pośrednictwem nienaruszone (przydatne do podpozycji tabeli), chyba że-s jest określony. -F, jeśli jest używany, linii do wprowadzania danych powinny zawierać 1023 znaków lub mniej.
lista Oddzielone przecinkami lub pustych znaków oddzielonych listy numerów pól liczb całkowitych (w porządku rosnącym), a opcjonalnie - w celu wskazania zakresów (np. 1,4,7; 1-3,8; -5,10 (skrót 1-5,10) lub 3 - (skrót od trzeciej do ostatniej dziedzinie)).
-N Nie należy dzielić znaków. Kiedy list-b-n i są używane razem, lista jest dostosowany tak, aby nie wielobajtowe charakter jest podzielona.
-D separatora Charakter po-d jest ogranicznik pola (opcja-F). Domyślnie jest tab. Przestrzeni lub inne znaki o specjalnym znaczeniu dla powłoki muszą zostać podane. separatora można wielobajtowe charakter.
-S Pomijanie linii bez znaków ogranicznika w przypadku opcja-f. O ile nie wskazano, linii ograniczniki zostaną przekazane przez nietkniętą.
plik Nazwę ścieżki pliku wejściowego. Jeśli nie podano argumentów pliku, lub jeśli plik argumentu jest -, standardowe wejście będą wykorzystywane.
Przykłady
name = "Kim jestem | cut-f1-d ''` - nazwa ustawiona na obecną nazwę logowania.
------------------------------------------------
AWK jest to język wyszukiwania wzorców oraz przetwarzania tekstów.
Wygląda to następująco:
awk '{przetwarzanie}'
Przydaje sie, kiedy chcemy wypisać tylko określone wiersze lub kolumny z pliku lub czytane z wyjścia jakiegoś polecenia.
AWK przetwarza plik wiersz po wierszu, zapisując dany wiersz i poszczególne kolumny w zmiennych. Brzmi to trochę skomplikowanie ale nie należy się przejmować - w rzeczywistości jest to bardzo proste. Już podaje przykład: Przypuśćmy że posiadamy plik Telefony z numerami telefonów w formacie:
Mariusz 233-34-35 Włocławek
Ania 223-22-33 Sopot
i chcemy wyświetlić tylko imiona i numery telefonów (miasto nas nie interesuje) to robimy następująco:
cat Telefony | awk'{print $1, $2}'
lub
awk'{print $1, $2}' < Telefony
Oba polecenia dają identyczne wyniki, pierwsze przekazuje (potokiem) plik wyświetlony poleceniem cat, drugie pobiera dane bezpośrednio z pliku.
Ne ekranie zobaczymy oczywiście:
Mariusz 233-34-35
Ania 223-22-33
Zatem wiadomo już że kolejne kolumny przechowywane są w zmiennych opatrzonych kolejnymi liczbami. Dokładnie tak jak poniżej.
$1 - pierwsza kolumna
$2 - druga kolumna
$3 - trzecia kolumna
....
$n - n-ta kolumna
$0 oznacza cały wiersz
W naszym przypadku będzie to wyglądało następująco:
$1="Mariusz" $2="233-34-35"
a następnie:
$1="Ania" $2="223-22-33 "
Oczywiście w zmiennej $0 będzie siedział cały pierwszy wiersz:
$0="Mariusz 233-34-35"
później
$0="Ania 223-22-33"
i tak w kółko aż do końca pliku - wygodne prawda?
Co zrobić jeśli chcemy zachować nasze wyniki w drugim pliku?
Oczywiście użyjemy znanego nam przekierowania >
Robimy to następująco:
cat Telefony | awk'{print $1, $2}' > Tel_bez_miast
lub
awk'{print $1, $2}' < Telefony > Tel_bez_miast
Teraz pokażę jak postępować z danymi pochodzącymi z poleceń wydawanych bezpośrednio z konsoli, chyba najpopularniejszą komendą jest ls. Użyje jej z parametrem -l aby dostać dużo informacji. Będziemy mogli sami zdecydować które kolumny mają być wyświetlone. :)
Przykładowy wydruk polecenia ls -l:
drwxrwxr-x 2 mariusz mariusz 1024 mar 31 20:48 Praca
-rw-r--r-- 1 mariusz mariusz 34304 mar 23 18:56 ~z_sieci
Przypuśćmy że chcemy wypisać tylko kolumny 1 oraz 9, czyli prawa dostępu do pliku oraz plik/katalog. Wystarczy do tego instrukcja:
ls -l | awk '{print $1,$9}'
Teraz nasz wydruk wygląda następująco:
drwxrwxr-x Praca
-rw-r--r-- ~z_sieci
Nic nie staje na przeszkodzie aby wyświetlić kolumny w odwrotnej kolejności:
ls -l | awk '{print $9,$1}'
Wynik:
Praca drwxrwxr-x
~z_sieci -rw-r--r--
Mając plik z danymi pracownika w formacie:
Imie Nazwisko Stanowisko Tel. domowy Miasto
Jan Kowalski Kierownik 233-22-21 Włocławek
Elwira Lewandowska Sekretarka 241-13-13 Toruń
Antoni Kwiatkowski Dyrektor 413-14-55 Włocławek
chcąc wypisać odpowiednio kolumny: Nazwisko, Imię, Tel. domowy, piszemy:
cat dane | awk '{print $2, $1, $4}'
Może zdarzyć się że separatorem kolumn będzie znak dwukropka:
Jan:Kowalski:Kierownik:233-22-21:Włocławek
Wtedy używamy parametru -Fseparator, w tym przypadku będzie to miało postać:
cat dane | awk -F: '{print $2, $1, $4}'
Jeśli życzymy sobie, aby kolumny na wyjściu były rozdzielone znakami tabulacji, albo dowolnym łancuchem możemy napisać:
cat dane | awk -F: '{print "Pierwsza kolumna: " $2,"druga:" $1,"trzecia:\t" $4}'
Wzorce z wyrażeniem regularnym
Przypuśćmy że chcemy wyświetlić wiersze zawierające wyraz TELEFON z pliku prywatne.txt:
awk '/TELEFON/' prywatne.txt
Możemy tutaj używać wszelkich wyrażeń regularnych jakie nam pzyjdą do głowy np:
awk '/TEL*/' prywatne.txt
awk '/^TELEFON/' prywatne.txt
awk '/[ao]la/' prywatne.txt
itp.
Mówiłem to o całych wierszach, jednak nic nie stoi na przeszkodzie aby sprawdzać poszczególne kolumny.
np polecenie ls -l wyświetla m.in. właściciela pliku oraz grupę do której należy:
drwxr-xr-x 2 root mariusz 1024 maj 9 19:13 publ.txt.txt
drwxr-xr-x 2 mariusz root 1024 maj 9 19:13 rower
-rwxrwxr-x 1 mariusz mariusz 45 kwi 9 22:08 rozmiar.txt
Nas interesuje tylko właściciel a więc piszemy:
ls -l | awk '$3 == "mariusz"'
Jeśli warunek spełniony, wiersz jest drukowany:
drwxr-xr-x 2 mariusz root 1024 maj 9 19:13 rower
-rwxrwxr-x 1 mariusz mariusz 45 kwi 9 22:08 rozmiar.txt
Utworzenie tabeli html z zawartości pliku. Plik ma dowolną ilość wierszy i jest w formacie:
a b c
d e f
Plik rozdzielamy na kolumny:
cat a | awk '{print $1,$2,$3}'
dodajemy instrukcje html'a (w cudzysłowach):
echo " < table border=1> " > tab.html
cat a | awk '{print "
echo "">> tab.html
Dobra wiadomość: W AWK możemy dodać informacje, które mają się pojawić przed przetworzeniem pierwszego wiersza pliku (BEGIN), jak również po przetworzeniu ostatniego wiersza pliku (END):
Konstrukcja jest następująca:
awk 'BEGIN{nagłówek} {właściwe przetwarzanie} END{zakończenie}'
Po wykonaniu następujących instrukcji:
cat a | awk 'BEGIN{print "
"$1" | ",""$2" | ",""$3" |
w pliku tab.html pojawi się tekst:
a | b | c |
d | e | f |
Brak komentarzy:
Prześlij komentarz