2017-03-08 3 views
-4

Ich wollte ein Bash-Skript in Python zum Training konvertieren. Der Bash-Skript fragt einen Remote-Host für seine df via ssh und sucht in die zurückgegebenen Zeile für ein bestimmtes Feld, etwa so:Grep-ing für Linien in Python

ssh $_host df 2>/dev/null | grep -i $_filesystem | grep : 

In Python, verwende ich subprocess.call in Kombination mit shlex.split die „df“ Ausgabe zu erhalten:

_cmd = shlex.split("ssh %s df 2>/dev/null" % _host) 
_test = subprocess.check_output(_cmd) 

Hier _test kehrt als Typ String und wenn ich will es für Zeile Zeile suchen, gibt es jedes Zeichen als eine neue Linie aus. subprocess.Popen für Rohre funktioniert auch nicht. Ich möchte nur die Zeile ausgeben, in der mein Suchstring zur weiteren Formatierung gefunden wird.

Ich habe bereits mehrere Versuche gesehen, die sich einer Lösung nähern, aber die meisten von ihnen durchlaufen Dateien mit definierten Zeilenumbrüchen, keine Zeichenfolgen, die von einem Unterprozessaufruf zurückgegeben werden.

+3

Bash ist eine domänenspezifische Sprache, die speziell für die Interaktion mit Prozessen entwickelt wurde. Python ist eine allgemeine Sprache, die alles kann. Ich würde gerne sehen, dass Sie einen Webserver in einem Shell-Skript schreiben. –

+0

Danke für die Klärung, obwohl es überhaupt nicht hilft. –

+1

Der "richtige" Weg wäre, etwas zu importieren, das 'ssh' verarbeiten kann. Ich würde 'fabric' empfehlen (google:" python fabric "). Momentan rufen Sie nur die ausführbare Datei ssh von python auf, was nicht so ist (normalerweise). Angesichts Ihres Hintergrunds in bash ist es verständlich, aber im Gegensatz zu bash Python bevorzugt Sie ** Bibliotheken **, nicht ** ausführbare Dateien **. –

Antwort

0

Sofern ich Ihre Erzählung nicht missverstanden habe, besteht das Problem darin, dass Sie über die Zeichenfolge _test (in Code, den Sie nicht anzeigen) iterieren. Dies iteriert jeweils um ein Zeichen. Sie müssen also nur schreiben

_test = _test.split("\n") 

_test in eine Liste von Linien zu drehen, und Sie werden Linien statt einzelner Zeichen bekommen, wenn Sie über sie iterieren.

+0

F mich seitwärts, war es SO einfach? O_o Ich habe etwas ähnliches versucht, aber mit .strip(). Ich suchte nach "String in Liste umwandeln" und versuchte es sogar mit einem Wörterbuch: D –

+0

Ja, es ist eine ziemlich einfache Sache :-) Python String Handling ist wirklich mächtig, lesen Sie es auf. Es gibt auch 'str.splitlines()', das fortlaufende Zeilenumbrüche als ein Trennzeichen behandelt. – alexis

+0

PS. Beachten Sie den Hinweis, nicht so schnell Subprozesse zu starten. In bash Begriffe, viele der Dinge, die Sie einen Prozess für verwenden würden, sind "Builtins" in Python (sie müssen sein, für die Plattformunabhängigkeit). – alexis