2017-03-08 10 views
-4

私は、BashスクリプトをPythonに変換してトレーニングをしたいと思っていました。 bashスクリプトはそうのように、ssh経由でそのDFのためのリモートホストに照会し、特定のフィールドのために返された行を検索:PythonでPythonでのgrep-ing

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

、私は「DF」の出力を得るためにshlex.splitと組み合わせてsubprocess.callを使用します。

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

、タイプ文字列として_test戻り、私はそれを行の行を検索したい場合は、それが新しい行としてすべての文字を出力します。パイプ用のsubprocess.Popenも機能しません。私がしたいのは、私のsearchstringがそれ以上の書式設定のために見つかった行を出力することだけです。

私はすでに解決策に近づいているいくつかの試みを見てきましたが、ほとんどはサブプロセス呼び出しによって返される文字列ではなく、定義されたキャリッジリターンでファイルを反復処理します。

+3

Bashは、プロセスとやりとりするために特別に設計されたドメイン固有の言語です。 Pythonは何でもできる汎用言語です。私はあなたがシェルスクリプトでウェブサーバを書くのを見たいと思います。 –

+0

それは全く役に立たないが、明確にしてくれてありがとう。 –

+1

「正しい」方法は、 'ssh'を扱うことができるものをインポートすることです。私は 'ファブリック'(Google: "python fabric")をお勧めしたいと思います。現在のところ、Pythonからssh実行可能ファイルを呼び出すだけです。これは、物事がどのように行われるか(通常は)ではありません。あなたの背景をbashで理解できれば、bashのpythonとは違って**実行可能ファイル**ではなく**ライブラリ**を使うのが好きです。 –

答えて

0

あなたの物語を誤解しない限り、問題は文字列_test(表示しないコード)を反復することです。これは、一度に1文字ずつ繰り返します。だから、あなただけの行のリストに_testを回すために、そしてあなたがそれを反復するときに、代わりに、単一の文字の行を取得することがあります

_test = _test.split("\n") 

を記述する必要があります。

+0

私は横になって、それは簡単でしたか? O_o 私は似たようなものを試しましたが、.strip()を使って試しました。 D –

+0

ええ、これはかなりシンプルなことです:-) Pythonの文字列処理は本当に強力で、それを読んでいます。 'str.splitlines()'もあります。これは連続した改行を1つのセパレータとして扱います。 – alexis

+0

PS。サブプロセスをすばやく起動できないというアドバイスに注意してください。 bashという言葉で言えば、プロセスを使用する多くのものは、Pythonの「組み込み関数」です(プラットフォーム独立のためには、それらを組み込む必要があります)。 – alexis

関連する問題