Wiem więc, że istnieją narzędzia do tego problemu, ponieważ o nich słyszałem, ale nie wiem, czym one są.
Chcę zrobić coś takiego jak odfiltrować wszystkie dane oprócz nazw użytkowników w / etc / passwd.
Na przykład chciałbym pobrać user1, user2 i user3 z następującego pliku. W takim przypadku logika może brzmieć: „Pobierz tekst do pierwszego„: ”w każdym wierszu pliku”.
user1:x:1:4
user2:x:2:5
user3:x:3:6
Dane wyjściowe będą:
user1
user2
user3
awk
pobiera nazwę pliku, dzięki czemu możesz pominąć fajkę i po prostu zrobićawk -F: '{print $1}' /etc/passwd
tr
iat
to kilka przykładów kilku rzeczy, które nie działają).Oto linijka Perl:
źródło
Pod perl i awk istnieje trzecie narzędzie do takich zadań, które jest sed:
To jest polecenie podstawienia: podstawienie z dwukropka:, po którym następuje kropka, która jest żartownisiem dla postaci dowolnego rodzaju, dowolnej liczby (*), bez niczego.
Jest to (ubstitute) / FROM / TO / 'z TO jest puste, co oznacza „usuń wszystko z pierwszego (ponieważ sed jest domyślnie chciwy) dwukropka (do końca linii, ponieważ sed działa dobrze z całymi liniami).
Oczywiście
cut
jest to również dobre polecenie, ale powiedziałbym, że z innej rodziny.źródło
W twoim przykładzie wszystkie 3 nazwy mają tę samą długość. W takich przypadkach - co może się zdarzyć, ale mało prawdopodobne w przypadku / etc / passwd - możesz również użyć colrm:
lub oczywiście
(rzadki przypadek, w którym
useless use of cat
nie ma zastosowania, ponieważ nie można przekazać pliku do działania jako parametru).źródło
cat
nadal jest bezużyteczny tam:colrm 6 < FILE
.cat foo | grep bar
.Dla kompletności nie ma potrzeby stosowania zewnętrznych poleceń, powłoka (powłoka Bourne'a lub kompatybilna) poradzi sobie sama:
Oczywiście jest to prawdopodobnie najwolniejsze ze wszystkich możliwych rozwiązań, więc w przypadku dużych plików wybierz inne.
źródło