0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LinuxのTopコマンドの出力をcsv出力する

Last updated at Posted at 2023-07-05

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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?