Prendi alcuni contenuti di un file


9

Quindi so che esistono strumenti per questo problema perché ne ho sentito parlare, ma non so cosa siano.

Voglio fare qualcosa come filtrare tutti i dati tranne i nomi utente in / etc / passwd.

Ad esempio, vorrei prendere user1, user2 e user3 dal seguente file. In questo caso, la logica potrebbe essere "Prendi il testo fino al primo ':' su ogni riga del file".

user1:x:1:4
user2:x:2:5
user3:x:3:6

L'output sarebbe:

user1
user2
user3

Risposte:


19

cutesiste esattamente per questo scopo. Il -dflag specifica il delimitatore e -fspecifica quali campi produrre:

cut -d: -f1 /etc/passwd

L'argomento -fpuò essere qualcosa di simile 1,3a mostrare il primo e il terzo campo o 1-3mostrare i primi tre; ci sono anche-b e -cflag per leggere byte e caratteri anziché campi. Se hai bisogno di qualcosa di più flessibile, generalmente awkfarà il trucco (vedi la risposta di Matthew )


13

Ogni volta che vuoi estrarre dati da un input tabulare, dovresti considerare awk . È disponibile praticamente su tutti i sistemi Unix, quindi è una buona abitudine prendere:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': definisce ":" come delimitatore di colonna.
  • '{}': esegue questa istruzione per ogni riga.
  • print $1: stampa la prima colonna sullo schermo.

3
Nota casuale: awkprende un nome file, quindi puoi saltare la pipa e bastaawk -F: '{print $1}' /etc/passwd
Michael Mrozek

Mi sembra sempre di dimenticare che awk prende un nome file, mi sembra sempre di usarlo in una pipeline ... qualcosa come sed | awk ecc ...
Matthew Brannigan,

quasi tutto ciò che funziona con i file prende un nome file ( tre atsono un paio di esempi delle poche cose che non lo fanno).
In pausa fino a ulteriore avviso.

3

Ecco un one-liner Perl:

perl -F/:/ -lane 'print $F[0]' /etc/passwd

1

Sotto perl e awk, esiste un terzo strumento per tali lavori, che è sed:

sed 's/:.*//' FILE 

Questo è il comando di sostituzione: sostituto dai due punti:, seguito da un punto, che è un jolly per personaggi di qualsiasi tipo, di qualsiasi conteggio (*), senza nulla.

È '(ubstitute) / FROM / TO /' con TO vuoto, che significa 'elimina tutto dal primo (dal momento che sed è di default avido) due punti (fino alla fine della linea, poiché sed funziona bene con intere linee).

Naturalmente cutè anche un ottimo comando, ma direi di una famiglia diversa.


1

Nel tuo esempio, tutti e 3 i nomi hanno la stessa lunghezza. In questi casi - cosa che potrebbe accadere, ma non così probabilmente con / etc / passwd - potresti usare anche colrm:

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

o, ovviamente

cat FILE | colrm 6 

(un caso raro in cui useless use of catnon si applica, perché non è possibile passare a un file FILE su cui agire come parametro.)


catè ancora lì inutile: colrm 6 < FILE.
arte

Bene, sì, ma non così inutile, come nella chiamata cat foo | grep bar.
utente sconosciuto

1

Solo per completezza, non sono necessari comandi esterni, la shell (Bourne shell o compatibile) può gestirla da sola:

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

Naturalmente, questa è probabilmente la più lenta di tutte le soluzioni possibili, quindi per file di grandi dimensioni scegline un'altra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.