2012-04-23 9 views
6

Sono davvero nuovo con bash, ma è una delle materie a scuola. Uno degli esercizi era:Bash: modello di grep dall'output del comando

Indicare il numero di riga del file "/ etc/passwd" dove sono le informazioni sul proprio accesso.

Supponiamo USERNAME è il mio ID di accesso, sono stato in grado di farlo perfettamente in questo modo:

cat /etc/passwd -n | grep USERNAME | cut -f1 

che semplicemente ha dato il numero di riga desiderato (ci può essere un modo più ottimizzato). Mi chiedevo tuttavia se ci fosse un modo per rendere il comando più generale in modo che utilizzasse l'output di whoami per rappresentare il modello di grep, senza script o utilizzando una variabile. In altre parole, per mantenerlo un comando facile da leggere una riga, in questo modo:

cat /etc/passwd -n | grep (whoami) | cut -f1 

Scusate se questa è una domanda davvero niubbo.

risposta

16
cat /etc/passwd -n | grep `whoami` | cut -f1 

Circondati da un comando nel `marchi rende eseguire il comando e inviare l'output nel comando è avvolto in.

+0

Ok, backtick ... Certo :) Grazie! – MarioDS

+1

Senza ancoraggio, questo può produrre false corrispondenze se il nome di login corrisponde ad altre voci sulla linea. Avevo un nome di accesso breve su un sistema locale che corrispondeva (una sottostringa di) "System Operator", quindi un software stupido pensava che fossi 'root' quando non lo ero. – tripleee

9

check sostituzione di comando nella pagina bash dell'uomo.

È possibile tornare indietro tick `` o $(), e personalmente preferisco quest'ultimo.

Quindi per la vostra domanda:

grep -n -e $(whoami) /etc/passwd | cut -f1 -d : 

sostituirà l'uscita del whoami come argomento per la -e la bandiera del comando grep e l'uscita di tutto il comando sarà il numero di riga nel /etc/passwd dell'utente che esegue .

+0

+1 perché funziona, ma la risposta di Lynn è più chiara da leggere (almeno per un principiante come me :)) ma mi piace che tu abbia sottolineato che dovrei usare l'opzione -n ​​di grep per renderlo più breve. – MarioDS

+4

+1, preferisco il costrutto '$()' semplicemente perché è molto più facile da annidare. – paxdiablo

+0

+1 Per indicare entrambe le sintassi :) –

10

Si può fare questo con un unico awk invocazione:

awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd 

Più in dettaglio:

  • il -v crea un awk variabile chiamata me e popola con il proprio nome utente.
  • il -F imposta il separatore di campo su : come si addice al file di password.
  • il $1==me seleziona solo le righe in cui il primo campo corrisponde al nome utente.
  • il print emette il numero di record (riga).
+0

grazie per l'ottima spiegazione, ma per ora sembra avanzato per me creare comandi come me :) – MarioDS

+3

@Mario: prima inizi a imparare, prima lo farai essere in grado di caricare tariffe esorbitanti per i tuoi servizi di sviluppo :-) – paxdiablo

+0

+1 per mostrare awk a un noobie –