質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2338閲覧

python ログの整形(テキスト処理)

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/17 00:25

下記ログを整形するため、2つどうしても実現できなくて困っております。

1つめ
全ての行に日時を一番左に入れておきたい。

2つ目
不要な空白(スペースやタブや改行など)を「,」一つに置き換えたい

アドバイスの程、よろしくお願い致します。

Wed Sep 15 17:26:27 JST 2021 MAC Address IP Type APID AP Name L2 Mode L3 Mode Authenticated User Name Tag/ID RF Band IP Mode Client IP Station Type OS Type VLAN Pool Name aa:aa:aa:aa:aa:aa Discovered 244 AP1 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.201.175 wireless 370103060f1f212b2c2e2f7779f9fc bb:bb:bb:bb:bb:bb Discovered 245 AP2 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.202.144 wireless 370103060f1f212b2c2e2f7779f9fc cc:cc:cc:cc:cc:cc Discovered 244 AP3 wpa2-psk clear 0 802.11an IPv4 192.168.203.133 wireless 370103060f1f212b2c2e2f7779f9fc Wed Sep 15 17:27:41 JST 2021 MAC Address IP Type APID AP Name L2 Mode L3 Mode Authenticated User Name Tag/ID RF Band IP Mode Client IP Station Type OS Type VLAN Pool Name aa:aa:aa:aa:aa:aa Discovered 244 AP1 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.201.175 wireless 370103060f1f212b2c2e2f7779f9fc bb:bb:bb:bb:bb:bb Discovered 245 AP2 wpa2-psk clear 0 802.11bgn2s20 IPv4 192.168.202.144 wireless 370103060f1f212b2c2e2f7779f9fc cc:cc:cc:cc:cc:cc Discovered 244 AP3 wpa2-psk clear 0 802.11an IPv4 192.168.203.133 wireless 370103060f1f212b2c2e2f7779f9fc

python

1import re 2 3Date_Param = r'\d{2}:\d{2}:\d{2}' 4Date_reg = re.compile(Date_Param) 5time_stanp = '' 6log = [] 7 8with open('wlc.log', 'r', encoding='shift_jis') as f: 9 lines = f.readlines() 10 11# 一番左に日時を入れる処理 12for line in lines: 13 m = Date_reg.search(line) 14 if m: 15 # print(line.strip('\n')) 16 time_stanp = line 17 sep = '' 18 else: 19 sep = '' 20 log_str = f"{time_stanp}{sep}{line}" 21 # log.append(log_str.strip('\r\n')) 22 print(log_str.split(','))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2021/09/17 01:48

これ……ログがカンマとかタブ区切りではなく、空白の個数もヘッダーとそれ以外で綺麗に並ぶわけでもないのは、元からそういうものなんですかね。 ヘッダーの各カラムの名前を切り分けるのにもヒューリスティックな知識が必要になるという。
guest

回答2

0

ベストアンサー

ヘッダーがなぜか2行に分かれているとか、設定されていない項目があるのに、空白だけで区切られていてそれを判別できないとか、ログ自体の構造がすでにどうしようもないので、適当にでっち上げます。

あとは、

  • 日付を判定している正規表現が、偶然MACアドレスと一致する可能性をなくす。
  • ヘッダーは、「実際にログで使われている」ものだけ別途用意し、ログの先頭にだけ表示する。
  • ログの空行を無視する。

Python

1import re 2 3date_pattern = r"^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2} \d{2}:\d{2}:\d{2} JST \d{4}$" 4date_reg = re.compile(date_pattern) 5header_pattern = r"^(?:MAC Address|VLAN Pool Name)" 6header_reg = re.compile(header_pattern) 7header_line = "MAC Address,IP Type,APID,AP Name,L2 Mode,L3 Mode,Tag/ID,RF Band,IP Mode,Client IP,Station Type,OS Type" 8 9time_stanp = 'Time Stamp' 10log_str = f"{time_stanp},{header_line}" 11print(log_str) 12 13with open('wlc.log', 'r', encoding='shift_jis') as f: 14 lines = f.readlines() 15 16for line in lines: 17 line = line.strip() 18 if not line or header_reg.search(line): 19 continue 20 21 if date_reg.search(line): 22 time_stanp = line 23 continue 24 25 line = re.sub(r"\s+", ",", line) 26 log_str = f"{time_stanp},{line}" 27 print(log_str)

result

1Time Stamp,MAC Address,IP Type,APID,AP Name,L2 Mode,L3 Mode,Tag/ID,RF Band,IP Mode,Client IP,Station Type,OS Type 2Wed Sep 15 17:26:27 JST 2021,aa:aa:aa:aa:aa:aa,Discovered,244,AP1,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.201.175,wireless,370103060f1f212b2c2e2f7779f9fc 3Wed Sep 15 17:26:27 JST 2021,bb:bb:bb:bb:bb:bb,Discovered,245,AP2,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.202.144,wireless,370103060f1f212b2c2e2f7779f9fc 4Wed Sep 15 17:26:27 JST 2021,cc:cc:cc:cc:cc:cc,Discovered,244,AP3,wpa2-psk,clear,0,802.11an,IPv4,192.168.203.133,wireless,370103060f1f212b2c2e2f7779f9fc 5Wed Sep 15 17:27:41 JST 2021,aa:aa:aa:aa:aa:aa,Discovered,244,AP1,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.201.175,wireless,370103060f1f212b2c2e2f7779f9fc 6Wed Sep 15 17:27:41 JST 2021,bb:bb:bb:bb:bb:bb,Discovered,245,AP2,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.202.144,wireless,370103060f1f212b2c2e2f7779f9fc 7Wed Sep 15 17:27:41 JST 2021,cc:cc:cc:cc:cc:cc,Discovered,244,AP3,wpa2-psk,clear,0,802.11an,IPv4,192.168.203.133,wireless,370103060f1f212b2c2e2f7779f9fc

投稿2021/09/17 02:12

編集2021/09/17 02:13
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/18 00:27 編集

すごい!!ありがとうございます。本当は、この様にしたかったのですが、まだ、自分の実力では、 出来そうもなく、とりあえず、日時だけ一番左に挿入しようとした次第です。 <質問> ①曜日を検索するとき、 ?: は、なぜ必要になるのでしょうか? (月の検索も同様) ②if not line or header_reg.search(line): の処理がイマイチ、理解できません。 line 又は、header部分に該当しないときということなので、・・・データー部分だけがlineに入る ということなのでしょうか?
Daregada

2021/09/18 01:44 編集

> ①曜日を検索するとき、 ?: は、なぜ必要になるのでしょうか? (月の検索も同様) 正規表現の()には、複数の機能が重ねて割り当てられています。 ・グループ化……()内のパターンをまとめて扱う ・キャプチャ……()内のパターンにマッチした実際の文字列を、パターンのその部分より後で使用する。あるいは、置換文字列でマッチした文字列を使用する。 今回、キャプチャの機能は必要ないので、後から正規表現に追加された (?:)を使っています。こちらは、グループ化の機能しか持っていません。 もちろん、()を使っても、キャプチャという今回の処理では余分なことが行なわれるだけで、マッチには影響しません。 > ②if not line or header_reg.search(line): の処理がイマイチ、理解できません。 「not line」は、今回のコードでは「line == ""」と同じです。直前にline.stripしているので、文字列両端の連続する空白文字(改行を含む)が削除されており、「改行だけの行」や「複数の空白と改行の行」は、"" (空文字列)になっています。その場合はログに表示しないので、ここでcontinueして、次の行の処理に移ります。 「header_reg.search(line)」は、「ヘッダーと見なす文字列にマッチ」したときにTrueになる条件です。header_regは、header_patternの文字列からコンパイル(Pythonが使いやすい形に変換)された正規表現オブジェクトで、「(先頭の空白の連続を取り除くと)MAC AddressかVLAN Pool Nameで始まる行」にマッチします。その場合はログに表示しないので、ここでcontinueして、次の行の処理に移ります。
Daregada

2021/09/18 01:48

問題が解決したのであれば、この質問を『解決済み」にしてください。
guest

0

深く考えずにやるなら以下のようなコードになります。

不要な空白(スペースやタブや改行など)を「,」一つに置き換えたい

re.split(r'\s+', line)で分割し','.join(l)することで実現しています。

なお、私ならログ出力処理部分に目を向けて、そもそも希望(に近い)の形式で出力できないか調査、検討します。

Python

1# 一番左に日時を入れる処理 2for line in lines: 3 line = line.rstrip() 4 m = Date_reg.search(line) 5 if m: 6 time_stanp = line 7 else: 8 l = re.split(r'\s+', line) 9 print(time_stanp + ',' + ','.join(l))

出力結果

Wed Sep 15 17:26:27 JST 2021,MAC,Address,IP,Type,APID,AP,Name,L2,Mode,L3,Mode,Authenticated,User,Name,Tag/ID,RF,Band,IP,Mode,Client,IP,Station,Type,OS,Type Wed Sep 15 17:26:27 JST 2021,,VLAN,Pool,Name Wed Sep 15 17:26:27 JST 2021, Wed Sep 15 17:26:27 JST 2021,aa:aa:aa:aa:aa:aa,Discovered,244,AP1,wpa2-psk,clear,0,802.11bgn2s20,IPv4,192.168.201.175,wireless,370103060f1f212b2c2e2f7779f9fc Wed Sep 15 17:26:27 JST 2021, :

投稿2021/09/17 01:35

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問