/*Google AdSense自動広告*/

2020年5月24日日曜日

PythonとPowershellでgrep的処理を行う

パイプとかgrepとか、Linuxを使い始めの頃は訳の分からない魔法に見えますが、慣れるとGUIより早く便利で、何よりも流行りのRPA、業務自動化に繋げられます。

システムをWeb化したのはいいが、自動化のためブラウザをSeleniumで動かすなんて、地獄ですからね …「途中で止まるんですけど!」「勝手にid変わってる!」

極力、GUIを自動化するのはやめて、CSVやテキストで出力し、GASでGoogle Siteに出力、というようなスマートな方法を採りたいものです。

今回の記事では、下記のようなファイルから、例としてSendaiServerのアドレス(192.168.120.3)だけを抜き出したい場合…

FukushimaServer,192.168.10.2
SendaiServer,192.168.120.3
TokyoServer,192.168.1.1

この処理を、Linux/Python/Powershellそれぞれ紹介していきます。

Linux grepでファイル内の文字を検索する

grep "SendaiServer" sample_server_list.txt | cut -d , -f2

パイプの後はawkでもsetでも。ワンライナーでシンプル。ただ、可視性とか検索した文字を利用して色々…となると後者のやり方にもメリットが見えてきます。

Python版

myPath = "C:/myApps/python/sample_server_list.txt"
with open(myPath, 'r', encoding='utf-8') as file:
    lines = file.readlines()
    for line in lines:
        if line.startswith("SendaiServer"):
            address = line.strip().split(",")[1]

print(address)

For Eachで回すので、一番汚いコードだと思う…。綺麗なやり方ご存知でしょうか?
withによるファイルオープンではブロックの最後に必ずファイルが閉じられるので、このやり方を推薦します。また、readlinesでは改行コードも入ってしまうので、strip()で抜いた後にsplit()します。

PowerShell版

$finder = Select-String -Path $PSScriptRoot\sample_server_list.txt -Pattern "SendaiServer";
$address = $finder.line.Split(",")[1];
Write-Output $address;

Select-Stringはgrepと同じような動作をしますが、帰ってくるのはオブジェクト(MatchInfo Class)なので、その中のlineを抜き出して、Splitする必要があります。
普通に$finder.ToStringを出力すると、「ファイル名:行:見つかった行」とコロン区切りで色々な情報が入ってくるので、これをコロン区切りのSplitで分割して…というのは初心者の陥る罠です。でも、うん、分かります…Select-Stringって言ってますからね!



0 件のコメント:

コメントを投稿