Ich habe eine Beispieldatei / etc / passwd wie folgt:
tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash
Ich versuche, alle Benutzer mit einem Home-Ordner aufzulisten /home/
.
Ich hab geschrieben
cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
Dabei ist e.txt der Text, den ich hier kopiert habe.
Ich verstehe, dass es ein Problem mit dem Backslash gibt, bei dem es sich um ein Escape-Zeichen handelt, aber wie behebe ich es, damit ich sie in einer Befehlszeile auflisten kann?
text-processing
awk
wildcards
passwd
erans
quelle
quelle
cat
, Werkzeuge wieawk
odersed
oder ähnliches zu verwenden und weiterzuleiten , da ihnen der Dateiname als Argument gegeben werden kann.grep home e.txt | cut -d ":" -f 1
. Herzlichen Glückwunsch zu Ihrer UUOC-Auszeichnung. Dies ist jedoch keine gute Lösung. Was ist, wenn es einen Dienst "Homebackups" gibt, der unter einem separaten Benutzer ausgeführt wird, der nach dem Dämon benannt ist? Das ist falsch positiv.cat > tool
Variante solcher Befehlszeilen, da dies die Klarheit verbessern kann, indem der Fluss von links nach rechts beibehalten wird der Eingabe-Verarbeitung-Ausgabe der Rohrkette. Es ist weniger effizient, aber fast immer minimal. Es macht auch das Hinzufügen einen Fortschrittsbalken , wo relevant und nützlich , wenn interaktiv sehr offensichtlich läuft (nur ersetzencat
mit ,pv
wenn diese installiert ist).Antworten:
Sie können Schrägstrichen wie unten gezeigt entkommen:
Ein weiterer Trick wäre die Verwendung eines komplexen Feldtrennzeichens:
-F'[:/]'
- beides behandeln:
und/
ein Feldtrenner seinquelle
Sie können Anführungszeichen anstelle des
/
regulären Ausdrucks verwenden, um zu vermeiden, dass/
:Mit
awk
,{if (foo) ... }
kann oft nur noch vereinfacht werdenfoo {...}
.quelle
Unter der Annahme ,
e.txt
ist eigentlich/etc/passwd
sollten Sie tatsächlich nutzen ,getent passwd
anstatt die Datei zu parsen , da in bestimmten Benutzerkontoinformationen in mehreren Orten gespeichert werden/etc/nsswitch.conf
als LDAP so.Beachten Sie, dass die
print
Anweisung impliziert ist, wenn die Bedingung erfüllt ist. Dadurch wird jedoch die gesamte Zeile gedruckt. Dies gibt nur den Benutzernamen aus:quelle
Alternative für diejenigen von uns, die awk einfach nicht mögen:
Erläuterung:
grep -E
ermöglicht die Verwendung einiger erweiterter Funktionen für reguläre Ausdrücke([^:]*:)
entspricht einer Spalte, einschließlich des folgenden Trennzeichens ':'^([^:]*:){5}
stimmt mit den ersten fünf Spalten jeder Zeile überein^([^:]*:){5}/home/
stimmt mit jeder Zeile überein, in der die 6. Spalte mit '/ home /' beginnt.cut -d: -f1
Wählt nur die erste Spalte seiner Eingabe aus und verwendet sie:
als Spaltentrennzeichenquelle
Sie können auch eine
index
feste Zeichenfolgenübereinstimmung wie verwendengrep -F
und den Rückgabewert verwenden, um sicherzustellen, dass er mit dem Zeichenfolgenanfang übereinstimmtoder wenn Regex benötigt wird, übergeben Sie es als Umgebungsvariable
quelle
Nur für Abwechslung
Erläuterung
Variation, wenn Sie wählerisch sein möchten, wo sich etwas
/home/
befindetquelle