PythonスクリプトとBash

単純なアクションを自動化するという点で、両方のバージョンのスクリプトが強力なツールであることは周知の事実です。 私はこの小さな記事を読んで考えました-なぜ私たちは悪化するのですか? このトピックは非常に広範ですが、Pythonスクリプトを使用して簡単なコンソールアクションを自動化する方法を説明します。

行こう!


コンソールでPythonスクリプトを実行可能にするには、次のような最初の行が必要です。

#!/usr/bin/python

/ usr / bin / pythonは、システムにインストールされているPythonインタープリターのアドレスです。 もちろん、スクリプトを実行するユーザーには、スクリプトを実行する権限が必要です。 通常、これはNIXシステムでのみ機能します。 Windowsでは、インタープリターと.pyファイルタイプの間で通信が確立されると、スクリプトが自動的に実行可能になります。

一般に、Pythonスクリプトは多くの点でBashスクリプトに似ていますが、私の意見では、はるかにエレガントです。 必要になる可能性のある主な機能を検討してください。

listdir(path)
pathという名前のフォルダー内のファイル名とフォルダー名のリストを返します。

mkdir(path)
pathというフォルダーを作成します。

makedirs(path)
mkdir()関数と同様に機能しますが、必要なすべての中間フォルダーを自動的に作成します。

remove(path)
pathという名前のファイルを削除します。

rmdir(path)
pathという名前のディレクトリを削除します。

removedirs(path)
rmdir()関数と同様に機能しますが、すべての親空フォルダーを自動的に削除します。

rename(src, dst)
srcという名前のファイルまたはフォルダーの名前をdstに変更します。

open(filename, flag)
filenameという名前のファイルを開きます。 アクセスモードを決定するには、フラグが必要です。 "r"-読み取り、 "w"-書き込み、 "a"-追加。

read(size)
ファイルからサイズデータを読み取り、文字列として返します。 引数を省略すると、ファイルの内容全体が読み取られます。

readline()
改行文字( "\ n")を含むファイルから1行読み取ります。

readlines()
ファイルからすべての行を読み取り、それらをリストとして返します。

write(string)
文字列をファイルに書き込みます。

writelines(lines)
行リストから行をファイルに書き込みます。 それらの間に改行は追加されません。

tell()
ファイルの先頭からファイルの現在位置をバイト単位で返します。

seek(offset, whence)
位置をオフセットに変更します。 位置決めの性質は、whence引数(デフォルトは0)に依存します。
1)0-新しい位置はファイルの先頭からカウントされます;
2)1-ファイルの最後から。
3)2-ファイル内の現在の位置から。

truncate(size)
ファイルをサイズsizeに切り捨てます。

close()
ファイルを閉じます。 覚えて! ファイルを開いた後は、このメソッドを使用して後続の閉鎖を行う必要があります。

そして今、より特別な場合に。


頭のおPor? 何も、今すべての詳細を分析します。

最初に追加することは、少しの対話性です。 それ以外の場合、スクリプトの意味は、ユーザーに何かを尋ねない場合ですか? :)キーボードからの入力には、 raw_input()メソッドが使用されます。 なぜ()を入力しないのですか? 入力()を介して行を読み取る場合、 入力された行をコマンドに変換するインタープリターを介して渡されるためです。 rm -rfを入力する手とかゆみ...さて、大丈夫、運転しました! 関数の構文は次のとおりです。

login = raw_input("Enter your name: ")
ここで、 ログインEnterキーを押した後にユーザーが入力した文字列が読み込まれる変数です。
次に、ファイルを開いて、情報を書き込みましょう。

gogo = open ("/home/username/helloworld","w")
gogo.write("Hello, world!")
gogo.close()


ところで、 / home / username / helloworldに乱雑なファイルがある場合は、上記を実行する前に確認することをお勧めします。 そして、結局のところ、彼のすべてが消去され、「Hello、world!」以外の犯罪現場には何も残されません。

それでは、コンソールを直接操作しましょう。 個人的には、1つのコードで、 host domen.comコマンドの発行からプロバイダーのホストアドレスを取得しました。 すぐに言ってやった。

import os
import re
vid = os.popen("host l2tp.corbina.ru")
re_dns = re.compile(r"([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)")
for line in vid.readlines():
hst=re_dns.search(line)
if (hst != None):
break
host=hst.group(0)
print "Corbina host adress is "+host


うわー、いくらですか...さて、それを把握しましょう。 行ごと。

import os
import re

すべてが機能するように、標準のPythonライブラリを接続します。 os-システムコールとコンソールを操作するためのライブラリ。 re-正規表現を使用します。

vid = os.popen ("host l2tp.corbina.ru")
ここでは、 ホストのl2tp.corbina.ruコマンドを 「コンソールに入力」し、リストとしてvid変数に詰め込みます。

re_dns=re.compile(r"([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)")
これは私の友人、正規表現の変換です。 re_dnsは、 re.compile()メソッドを使用して特定のオブジェクトが取得される変数です。 正規表現の構文については説明しません。これは最も単純であるため、特に言えることです。これはIPアドレスの最も単純なフィルターオプションです。

for line in vid.readlines():
これがforループの始まりです。 Python言語では、 forループの構文が他の言語とはかなり異なることにすでに気づいたと思います。 ここでは、変数lineを使用します。この変数には、リストvid.readlines()の行が順番に書き込まれます。 リスト内の行が終了します-サイクルが終了します。 末尾のコロンは、ループ内で発生するステートメントのセクションの始まりを示します。 これらの演算子は、タブまたはいくつかのスペースで区切る必要があります。 ループで発生するはずのすべてを記述したらすぐに、行の先頭から次のステートメントを記述します。 ちなみに、これは以下に示すように条件付きifステートメントにも適用されます。

hst=re_dns.search(line)
そしてここで、以前に受け取った正規表現オブジェクトをline に適用します。その結果、一致する行のリストがhstに返されるか、何も見つからない場合はNoneになります。

if (hst != None):
break

同じNoneを確認します。 休憩前にインデントにもう一度注意してください。 おそらく他の言語から知っているように、この同じブレークはループ割り込み演算子です。 したがって、 hstNoneに等しくなくなるとすぐに、サイクルが中断されます。

host=hst.group(0)
先ほど言ったように、一致する正規表現文字列のリストがhst変数に返されます。 実際、より正確には、戻り値はリストではなく、要素のタプルです。 そして、最初の適切な行が見つかるとすぐにループを壊したので、タプルの最初の(ゼロでもある)要素に書き込まれ、安全に取得してhostに書き込みます

print "Corbina host adress is "+host
そして、このIPアドレスをコンソールに表示します。 printステートメントは、渡された文字列をコンソールに出力し、単純な追加によって文字列の連結を許可します。

まあ、実際には、これで開始です。 特に不満がある場合は、ストーリーの荒れ具合をorったり蹴ったりしないでください。喜んで耳を傾けて修正しようとします。

Source: https://habr.com/ru/post/J47474/


All Articles