2012-04-23 17 views
6

Ich bin wirklich neu mit Bash, aber es ist eines der Themen in der Schule. Eine der Übungen war:Bash: grep Muster von Befehlsausgabe

Geben Sie die Zeilennummer der Datei "/ etc/passwd" an, wo sich die Informationen zu Ihrem eigenen Login befinden.

Angenommen USERNAME meine eigene Login-ID ist, konnte ich es perfekt auf diese Weise tun:

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

, die einfach die Zeilennummer gab erforderlich (es kann eine optimierte Art und Weise). Ich fragte mich jedoch, ob es einen Weg gab, den Befehl allgemeiner zu machen, so dass er die Ausgabe von whoami verwendet, um das grep-Muster darzustellen, , ohne eine Variable zu schreiben oder zu verwenden. Mit anderen Worten, es zu halten, einen einfach zu lesende einzeiligen Befehl, etwa so:

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

Sorry, wenn dies eine wirklich Noob Frage.

Antwort

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

einen Befehls in `Markierungen Umgebung macht es den Befehl ausführen und in die Ausgabe in den Befehl es gewickelt senden.

+0

Okay, Backticks ... Natürlich :) Danke! – MarioDS

+1

Ohne Verankerung kann dies zu falschen Übereinstimmungen führen, wenn Ihr Anmeldename mit einer anderen Stelle in der Zeile übereinstimmt. Ich hatte einen kurzen Login-Namen auf einem lokalen System, das passierte (ein Teilstring von) "System Operator", so dass einige dumme Software dachte ich wäre "root", wenn ich nicht war. – tripleee

9

Prüfbefehl Substitution in der bash -Handbuchseite.

Sie können zurück Ticks `` oder $(), und persönlich bevorzuge ich Letzteres.

Also für Ihre Frage:

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

wird die Ausgabe von whoami als Argument für die -e Flagge des grep Befehl und die Ausgabe des gesamten Befehl ersetzen wird in /etc/passwd der laufenden Benutzerzeilennummer sein .

+0

+1, weil es funktioniert, aber Lynns Antwort ist klarer zu lesen (zumindest für einen Anfänger wie mich :)) aber ich mag, dass Sie darauf hingewiesen, dass ich die Option -n von Grep verwenden sollte, um es kürzer zu machen. – MarioDS

+4

+1, bevorzuge ich auch das '$()' Konstrukt, einfach weil es so viel einfacher zu verschachteln ist. – paxdiablo

+0

+1 Für das Aufzeigen beider Syntaxen :) –

10

Sie können dies mit einem einzigen awk Aufruf:

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

Im Detail:

  • die -v schafft eine awk Variable namens me und füllt es mit Ihrem Benutzernamen.
  • Die -F setzt den Feldtrenner auf :, wie es der Kennwortdatei entspricht.
  • Die $1==me wählt nur Zeilen aus, bei denen das erste Feld mit Ihrem Benutzernamen übereinstimmt.
  • Die print gibt die Datensatznummer (Zeile) aus.
+0

danke für die großartige Erklärung, aber jetzt scheint es für mich fortgeschritten zu sein, Befehle wie diese selbst aufzubauen :) – MarioDS

+3

@Mario: je früher du lernst, desto eher wirst du in der Lage sein, exorbitante Preise für deine Entwicklungsdienste zu verlangen :-) – paxdiablo

+0

+1 Für das Angeben von awk zu einem Noobie –