Angenommen, Sie stoßen während Ihres Arbeitstages wiederholt auf die folgende Form der Spaltenausgabe eines Befehls in bash (in meinem Fall durch Ausführung svn st
in meinem Rails-Arbeitsverzeichnis):
? changes.patch
M app/models/superman.rb
A app/models/superwoman.rb
Um mit der Ausgabe Ihres Befehls - in diesem Fall den Dateinamen - arbeiten zu können, ist eine Art Analyse erforderlich, damit die zweite Spalte als Eingabe für den nächsten Befehl verwendet werden kann.
Was ich getan habe, ist, awk
um in die zweite Spalte zu gelangen, z. B. wenn ich alle Dateien entfernen möchte (nicht, dass dies ein typischer Anwendungsfall ist :), würde ich Folgendes tun:
svn st | awk '{print $2}' | xargs rm
Da ich dies oft tippe, ist eine natürliche Frage: Gibt es einen kürzeren (also cooleren) Weg, dies in Bash zu erreichen?
HINWEIS: Was ich frage, ist im Wesentlichen eine Shell-Befehlsfrage, obwohl sich mein konkretes Beispiel in meinem SVN-Workflow befindet. Wenn Sie der Meinung sind, dass der Workflow albern ist und einen alternativen Ansatz vorschlagen, werde ich Sie wahrscheinlich nicht ablehnen, andere jedoch, da die Frage hier wirklich lautet, wie die Ausgabe des Befehls für die n-te Spalte in bash so schnell wie möglich ausgeführt werden kann . Vielen Dank :)
Antworten:
Sie können verwenden,
cut
um auf das zweite Feld zuzugreifen:Bearbeiten: Entschuldigung, ich habe nicht bemerkt, dass SVN keine Tabulatoren in seiner Ausgabe verwendet, also ist das ein bisschen nutzlos. Sie können
cut
die Ausgabe anpassen , aber sie ist etwas zerbrechlich - so etwas wiecut -c 10-
würde funktionieren, aber der genaue Wert hängt von Ihrem Setup ab.Eine andere Option ist so etwas wie:
sed 's/.\s\+//'
quelle
cut -f2
mit dersvn st
Ausgabe zu verwenden. Sie werden sehen, dass es nicht funktioniert.svn st
Tabs in seiner Ausgabe verwenden würde. Nach einigen Tests scheint dies nicht der Fall zu sein. Verdammt.-d
funktioniert dies.cut -d" " -f2
.Um dasselbe zu erreichen wie:
Wenn Sie nur Bash verwenden, können Sie Folgendes verwenden:
Zugegeben, es ist nicht kürzer, aber etwas effizienter und behandelt Leerzeichen in Ihren Dateinamen korrekt.
quelle
a
undb
wie bekommen sie?a
repräsentiert die erste Spalte undb
repräsentiert die verbleibenden Spalten. Wenn Sie die zweite Spalte drucken möchten, verwenden Sieread a b c;
und verwenden Sieecho
stattdessen anstelle vonrm
. Ich habe dies verwendet, um eine Reihe von ID-Prozessen zu erhalten, die einem Grep-Muster folgten, damit ich sie alle unterbrechen konnte.Ich befand mich in der gleichen Situation und fügte meiner
.profile
Datei folgende Aliase hinzu :Was mir erlaubt, solche Dinge zu schreiben:
quelle
function c() { awk "{print \$$1}" }
Dann kannst du machen:svn st | c 2 | xargs rm
Versuchen Sie das zsh. Es unterstützt Suffix-Alias, sodass Sie X in Ihrer .zshrc definieren können
dann können Sie tun:
Sie können noch einen Schritt weiter gehen und es für die n-te Spalte definieren:
Dadurch wird die n-te Spalte der Datei "Datei" ausgegeben. Sie können dies auch für Grep-Ausgabe oder weniger Ausgabe tun. Dies ist sehr praktisch und ein Killer-Feature des zsh.
Sie können noch einen Schritt weiter gehen und D wie folgt definieren:
Jetzt können Sie Folgendes eingeben:
um alle in der ersten Spalte der Datei "Datei" genannten Dateien zu löschen.
Wenn Sie die Bash kennen, ist das zsh bis auf einige neue Funktionen keine große Änderung.
HTH Chris
quelle
cut
Option zu gefallen scheint . Es funktioniert einfach nicht auf meinem Computer mit der Ausgabe vonsvn st
. Versuchesvn st | cut -d' ' -f2
nur zu sehen, was passiert.Hier ist ein Beispiel, da Sie mit Skripten nicht vertraut zu sein scheinen.
Wenn Sie dies in speichern
~/bin/x
und sicherstellen, dass~/bin
es in Ihrem istPATH
(jetzt ist das etwas, was Sie in Ihr setzen können und sollten.bashrc
Sie jetzt ), haben Sie den kürzestmöglichen Befehl zum allgemeinen Extrahieren der Spalte n; x n.Das Skript sollte eine ordnungsgemäße Fehlerprüfung und Kaution durchführen, wenn es mit einem nicht numerischen Argument oder der falschen Anzahl von Argumenten usw. aufgerufen wird. Die Erweiterung dieser unverzichtbaren Version wird jedoch in Einheit 102 erfolgen.
Vielleicht möchten Sie das Skript erweitern, um einen anderen Spaltenbegrenzer zuzulassen. Awk analysiert standardmäßig die Eingabe in Felder im Leerzeichen. Um ein anderes Trennzeichen zu verwenden, verwenden Sie
-F ':'
wo:
ist das neue Trennzeichen. Wenn Sie dies als Option für das Skript implementieren, wird es etwas länger, daher überlasse ich dies dem Leser als Übung.Verwendung
Gegeben eine Datei
file
:Sie können es entweder über stdin übergeben (indem Sie einen Nutzlosen
cat
lediglich als Platzhalter für etwas Nützlicheres verwenden);Oder geben Sie es als Argument für das Skript an:
Hierbei
sh script.sh
wird davon ausgegangen, dass das Skript wiescript.sh
im aktuellen Verzeichnis gespeichert ist . Wenn Sie es mit einem nützlicheren Namen irgendwo in Ihrem speichernPATH
und es als ausführbar markieren, wie in den obigen Anweisungen beschrieben, verwenden Sie stattdessen offensichtlich den nützlichen Namen (und neinsh
).quelle
awk -v col=$col ...
cat
hysterischen Gründen wurde dem Beispiel eine kleine Einschränkung hinzugefügt (-:Sie haben anscheinend bereits eine Lösung. Um die Sache zu vereinfachen, setzen Sie Ihren Befehl einfach in ein Bash-Skript (mit einem kurzen Namen) und führen Sie diesen aus, anstatt jedes Mal diesen 'langen' Befehl einzugeben.
quelle
.bashrc
? Warum sollten Sie es mit nicht-Bash-bezogenen Dingen überladen? Ich schreibe einzelne Skripte für jeden Befehlssatz und lege sie alle in ein~/scripts
Verzeichnis. Fügen Sie dann das Ganze~/scripts
zu meinem hinzu,PATH
damit ich sie einfach beim Namen nennen kann, wenn ich sie brauche.Wenn Sie die Spalte manuell auswählen können, können Sie mit pick :
Gehen Sie einfach zu einer beliebigen Zelle der 2. Spalte, drücken Sie
c
und drücken Sie dannenter
quelle
Beachten Sie, dass sich der Dateipfad nicht in der zweiten Spalte der svn st-Ausgabe befinden muss. Wenn Sie beispielsweise die Datei ändern und ihre Eigenschaft ändern, ist dies die 3. Spalte.
Mögliche Ausgabebeispiele finden Sie in:
Beispielausgabe:
Ich schlage vor, die ersten 8 Zeichen zu schneiden durch:
Wenn Sie 100% sicher sein möchten und sich beispielsweise mit ausgefallenen Dateinamen mit Leerzeichen am Ende befassen möchten, müssen Sie die XML-Ausgabe analysieren:
Natürlich möchten Sie möglicherweise einen echten XML-Parser anstelle von grep / sed verwenden.
quelle