LinuxのTOPコマンドをCSVで出力するPythonスクリプトです。
topコマンドのプロセス行を以下のカラム構成でcsvファイルに出力する
timestamp,USER,PR,NI,VIRT,RES,SHR,%CPU,%MEM,TIME+,COMMAND
第1引数: csv化対象topファイル
第2引数: 出力ファイル名
'''
import re
import os
import csv
import sys
####### 変数設定 ###############
# inputファイル名
input_file_name=sys.argv[1]
# outputファイル名
output_file_name=sys.argv[2]
# プロセス実行OS USER名
target_user = "usr+"
# topコマンドでプロセス行の始まりの位置
process_row_start = 8
# topコマンドでプロセス行のUSERカラムの位置
user_column = 2
# topコマンドでプロセス行のCOMMANDカラムの位置
command_column = 12
# timestamp正規表現
r_top_timestamp = re.compile("top - ([0-9:]+)+")
######## main 処理 #############
if __name__ == '__main__' :
###top.logファイル読み込み
f = open(f"{input_file_name}", "r")
toplog_lines = f.readlines()
f.close()
### timestamp行の抽出
timestamp_list = []
roop_cnt = 0
for toplog_line in toplog_lines :
# 正規表現でtimestamp一致したら行番号を配列に入れる
if r_top_timestamp.search(toplog_line) != None:
timestamp_list.append(roop_cnt)
roop_cnt += 1
### 対象Userのプロセスを抽出
rows_count = 0
tmp_timestamp = ''
tmp_output_csv_list = []
output_csv_list = []
for toplog_line in toplog_lines :
# 1回のTOP行数カウント +1
rows_count +=1
# 行末尾の改行を削除
toplog_line = toplog_line.rstrip()
# 改行のみの場合次の行へ
if not toplog_line :
continue
# タイムスタンプ行の場合、リストに追加する
if r_top_timestamp.search(toplog_line) != None:
print(toplog_line)
tmp_timestamp = r_top_timestamp.search(toplog_line).group(1)
# 1回のTOPコマンド結果、行数カウント初期化
rows_count = 1
continue
# プロセス行の場合、Userが一致すれば抽出する
if rows_count >= process_row_start:
column_number = 0
row_data = toplog_line.split(" ")
# タイムスタンプを設定
tmp_output_csv_list = [tmp_timestamp]
# 行末まで繰り返す
for column_data in row_data:
if column_data =="":
# 空白の場合次のカラムへ
continue
column_number += 1
# COMMANDカラムまでのデータをtmpリストに入れる
if column_number <= command_column :
tmp_output_csv_list.append(column_data)
else :
continue
# 抽出対象レコードかをチェックする
if (column_number == user_column) and (str(column_data) == target_user):
user_key_flg = True
if user_key_flg == True :
pass
else:
break
# for文をbreak以外で抜けたらCSV抽出リストに追加する
else:
output_csv_list.append(tmp_output_csv_list)
### CSV書き出し
csv_header = ['timestamp','PID','USER','PR','NI','VIRT','RES','SHR','S','%CPU','%MEM','TIME+','COMMAND']
with open(f'{output_file_name}','w') as f:
csv_writer = csv.writer( f, delimiter = ',', lineterminator = '\n')
csv_writer.writerow(csv_header)
csv_writer.writerows(output_csv_list)