Come eseguire grep su una singola colonna?


42

Voglio grep l'output del mio ls -lcomando:

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Voglio correre solo grep rahmusulla colonna $ 3, quindi l'output del mio grepcomando dovrebbe assomigliare a questo:

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Qual è il modo più semplice per farlo? La risposta deve essere portatile in molti Unices, preferibilmente concentrandosi su Linux e Solaris.

NB: Non sto cercando un modo per trovare tutti i file appartenenti a un determinato utente. Questo esempio è stato fornito solo per chiarire la mia domanda.


5
Nota che l' analisi dell'output di lsè intrinsecamente fragile (pensa cosa succede se un nome utente contiene spazi bianchi - e sì, ciò accade su alcune piattaforme). Usa findinvece.
Gilles 'SO- smetti di essere malvagio' il

Questo non risponde alla domanda sul titolo, ma menzionerò che l' --printfopzione statpotrebbe tornare utile in luoghi in cui potresti prendere in considerazione l'analisi ls. Ma di solito findè quello che vuoi (come menzionato da @Gilles).
Wildcard il

Risposte:


49

Ancora una volta awksalva la giornata!

Ecco un modo semplice per farlo, con una sintassi relativamente semplice:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

o anche più semplice: (Grazie a Peter.O nei commenti)

ls -l | awk '$3 == "rahmu"' 

9
Oppure: ls -l | awk '$3=="rahmu"'... e comunque, la (parentesi di apertura dovrebbe essere dopo if...awk '{if($3 ...'
Peter

3
@ Peter.O +1 da parte mia. Il tuo comando è più conciso, corretto, poiché la stampa è l'impostazione predefinita per una corrispondenza awk.
bsd,

Per evitare problemi di localizzazione (formato della data influenza ordine colonna) è spesso suggerito per garantire formato standard e la lingua:LANG=C ls -l | awk ...
fheub


11

Se per colonna intendi una colonna di dimensioni fisse, potresti:

ls -l | grep "^.\{15\}rahmu"

dove ^indica l'inizio della riga, .indica qualsiasi carattere e \{15\}indica esattamente 15 occorrenze del carattere precedente (qualsiasi carattere in questo caso).


2

So di essere in ritardo alla festa, ma credo che una soluzione molto generale a questo problema sia usare awk con espressioni regolari in questo modo:

awk '$3~/rahmu/{print}' input_file

La parte racchiusa da '//' può essere qualsiasi tipo di espressione regolare.


1

Per eseguire grep in base alla singola colonna del nome utente (e stampare solo i file), puoi provare:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

Per le directory, cambia -in d, per qualsiasi tipo rimuovi -.

In pratica, seleziona ogni colonna in base alla \S\+\s\+quale corrispondono caratteri non spaziali seguiti da caratteri spazio, quindi stiamo abbinando tre prime colonne e quindi il nome utente.

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.