Chwyć określoną zawartość pliku

9

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
Mouche
źródło

Odpowiedzi:

19

cutistnieje właśnie w tym celu. -dFlaga określa separator, i -fokreśla, które pola do wyjścia:

cut -d: -f1 /etc/passwd

Argumentem -fmoże być coś w rodzaju 1,3pokazania pierwszego i trzeciego pola lub 1-3pierwszych trzech; są też -bi -cflagi do odczytu bajtów i znaków zamiast pól. Jeśli potrzebujesz czegoś bardziej elastycznego, na ogół awkzrobisz to samo (zobacz odpowiedź Matthew )

Michał Mrożek
źródło
13

Za każdym razem, gdy chcesz wyodrębnić dane z danych tabelarycznych, powinieneś rozważyć awk . Jest dostępny na praktycznie każdym systemie Unix, więc dobrym nawykiem jest przyjmowanie:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': definiuje „:” jako separator kolumny.
  • '{}': wykonaj tę instrukcję dla każdej linii.
  • print $1: wydrukuj pierwszą kolumnę na ekranie.
Matthew Brannigan
źródło
3
Losowa uwaga: awkpobiera nazwę pliku, dzięki czemu możesz pominąć fajkę i po prostu zrobićawk -F: '{print $1}' /etc/passwd
Michael Mrozek
Zawsze wydaje mi się, że awk przyjmuje nazwę pliku, zawsze używam jej w potoku ... coś w stylu sed | awk itp ...
Matthew Brannigan
prawie wszystko, co działa z plikami, przyjmuje nazwę pliku ( tri atto kilka przykładów kilku rzeczy, które nie działają).
Wstrzymano do odwołania.
3

Oto linijka Perl:

perl -F/:/ -lane 'print $F[0]' /etc/passwd
Zaid
źródło
1

Pod perl i awk istnieje trzecie narzędzie do takich zadań, które jest sed:

sed 's/:.*//' FILE 

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 cutjest to również dobre polecenie, ale powiedziałbym, że z innej rodziny.

nieznany użytkownik
źródło
1

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:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

lub oczywiście

cat FILE | colrm 6 

(rzadki przypadek, w którym useless use of catnie ma zastosowania, ponieważ nie można przekazać pliku do działania jako parametru).

nieznany użytkownik
źródło
catnadal jest bezużyteczny tam: colrm 6 < FILE.
manatwork
No tak, ale nie tak bezużyteczne, jak w telefonowaniu cat foo | grep bar.
użytkownik nieznany
1

Dla kompletności nie ma potrzeby stosowania zewnętrznych poleceń, powłoka (powłoka Bourne'a lub kompatybilna) poradzi sobie sama:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

Oczywiście jest to prawdopodobnie najwolniejsze ze wszystkich możliwych rozwiązań, więc w przypadku dużych plików wybierz inne.

człowiek w pracy
źródło