[PYTHON] Extrahieren Sie das Ergebnis des TOP-Befehls mit USER und geben Sie es als CSV aus

Einführung

Aus verschiedenen Gründen werde ich es an meine Kollegen senden, die gezwungen sind, die Leistung mit dem TOP-Befehl von Linux zu messen.

Zweck

Eine Datei, die den Linux TOP-Befehl im Batch-Modus ausgibt. Formatieren Sie es mit Python3 in eine CSV-Datei.

top.csv (Ausgabebeispiel)


timestamp,PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND
10:00:00,1000,root,20,0,160000,2000,1640,R,10.0,0.2,0:00.02,top
10:00:00,3400,httpd,20,0,150000,2000,1700,S,0.0,0.3,0:07.98,nginx:

Was vorzubereiten?

Bereiten Sie die Dateiausgabe im TOP-Batch-Modus vor

TOP-Befehlsdatei


top -b -d 20 -c > top_org.log

top_org.log


top - 10:00:00 up 1 days, 44 min,  2 users,  load average: 0.00, 0.01, 0.01
Tasks: 100 total,   1 running, 99 sleeping,   0 stopped,   1 zombie
%Cpu(s):  2.0 us,  4.0 sy,  0.0 ni, 80.0 id,  5.0 wa,  0.0 hi,  2.0 si,  0.0 st
KiB Mem :  1000000 total,    60000 free,   700000 used,   200000 buff/cache
KiB Swap:  2000000 total,    90000 free,  2000000 used.    70000 avail Mem 

PID   USER     PR   NI VIRT     RES    SHR  S  %CPU %MEM  TIME+    COMMAND
1000 root      20   0  160000   2000   1640 R  10.0  0.2   0:00.02 top -b -d 20 -c
4500 apache    20   0  440000   1000      8 S   0.0  0.1   0:00.01 /usr/sbin/httpd
17000 mysql     20   0 1130000   7000      0 S   0.0  0.7  20:00.00 /usr/sbin/mysqld
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [kthreadd]
    4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 [kworker/0:0H]
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.00 [ksoftirqd/0]
・ ・ ・ (Unten weggelassen)

Für diejenigen, die es eilig haben

Am Ende dieses Artikels befindet sich nicht geteilter Quellcode. Bitte beziehen Sie sich darauf. Bitte ändern Sie zu diesem Zeitpunkt nur die folgenden Teile.

Der Teil, der sich jedes Mal ändert

-USER extrahiert werden -Lageort der "TOP-Befehlsdatei" -Lageort von "CSV-Datei mit formatierter TOP-Befehlsdatei" Wird im folgenden Teil eingestellt. Bitte ändern Sie es entsprechend Ihren gewünschten Bedingungen und Umgebung.

.py


'''
Informationen einstellen
'''
#Zu extrahierender BENUTZER (Wenn nicht festgelegt, werden alle BENUTZER extrahiert.,Durch Trennzeichen festgelegt)
user_array =['root'] 

#Holen Sie sich aktuelle Dir
current_dir = os.getcwd()
#Name der Eingabedatei(Full PATH)
input_file_name=f"{current_dir}\\before\\top_org.log"
#Name der Ausgabedatei(Full PATH)
output_file_name=f"{current_dir}\\after\\top_csv.csv"

Quellcode

Kommentar

  1. Einstellen der erforderlichen Informationen
  2. Lesen Sie die TOP-Befehlsdatei
  3. Extrahieren Sie den für die erste Spalte verwendeten Zeitstempel
  4. Extrahieren Sie den Prozess des Zielbenutzers
  5. Ausgabe der CSV-Datei

Ich werde in dieser Reihenfolge fortfahren.

1. Einstellen der erforderlichen Informationen

Geben Sie den zu extrahierenden USER und den Speicherort an, an dem sich die TOP-Befehlsdatei befindet.

.py


# -*- coding: utf-8 
import re
import os
import csv

'''
Informationen einstellen
'''
#Zu extrahierender BENUTZER (Wenn nicht festgelegt, werden alle BENUTZER extrahiert.,Durch Trennzeichen festgelegt)
user_array =['root'] 

#Holen Sie sich aktuelle Dir
current_dir = os.getcwd()
#Name der Eingabedatei(Full PATH)
input_file_name=f"{current_dir}\\before\\top.log"
#Name der Ausgabedatei(Full PATH)
output_file_name=f"{current_dir}\\after\\top.log"

#Was ist der Anfang der Prozesszeile im Ergebnis eines TOP-Befehls?
process_row_start = 8
#Welche Spalte hat die Position der USER-Spalte im TOP-Befehlsergebnis?
user_column = 2
#Wie ist die Position der Spalte COMMAND im Ergebnis des TOP-Befehls?
command_column = 12

2. Lesen Sie die TOP-Befehlsdatei

.py


    #Eingabedatei gelesen
    f = open(f"{input_file_name}", "r")
    toplog_lines = f.readlines()
    f.close()

Lesen Sie die Eingabedatei (TOP-Befehlsdatei) zeilenweise und speichern Sie sie in der Variablen toplog_lines.

3. Extrahieren Sie den für die erste Spalte verwendeten Zeitstempel

.py


    #regulärer Ausdruck des Zeitstempels
    r_top_timestamp = re.compile("top - ([0-9:]+)+")

    timestamp_list = []
    roop_cnt = 0
    for toplog_line in toplog_lines :
        #Wenn der Zeitstempel mit dem regulären Ausdruck übereinstimmt, fügen Sie die Zeilennummer der TOP-Befehlsdatei in das Array ein.
        if r_top_timestamp.search(toplog_line) != None:
            timestamp_list.append(roop_cnt)
        roop_cnt += 1

Hier ist der Zeitstempel (top --10: 00: 00 bis 1 Tag, 44 min, 2 Benutzer, Lastdurchschnitt: 0,00, 0,01, 0,01) Überprüfen Sie die Zeilennummer der TOP-Befehlsdatei und speichern Sie die Zeilennummer in timestamp_list.

4. Extrahieren Sie den Prozess des Zielbenutzers

Definieren Sie zunächst die erforderlichen Variablen in der Prozessextraktionsschleife.

.py


#Position des Starts der Prozesszeile mit dem Befehl TOP
process_row_start = 8
#Position der USER-Spalte in der Prozesszeile mit dem Befehl TOP
user_column = 2
#Position der COMMAND-Spalte in der Prozesszeile mit dem Befehl TOP
command_column = 12
#Variable zum gleichzeitigen Zählen der Anzahl der TOP-Befehlszeilen
rows_count = 0
#Variable zum Speichern des Zeitstempels
tmp_timestamp = ''
#Array (tmp) zum Speichern der Zeichenfolge, die an csv ausgegeben werden soll
tmp_output_csv_list = []
#Array zum Speichern der Zeichenfolge, die an csv ausgegeben werden soll (wird zum eigentlichen Schreiben verwendet)
output_csv_list = []

Führen Sie als Nächstes die TOP-Befehlsdatei zeilenweise durch. Wir implementieren Folgendes. ・ Extrahieren Sie die Ausführungszeit des TOP-Befehls (Zeitstempel). -Überprüfen Sie den Prozess spaltenweise, und wenn es sich um das Extraktionsziel USER handelt, geben Sie das CSV-Ausgabeziel ein

.py


    for toplog_line in toplog_lines :
        #Zählen Sie die Anzahl der TOP-Zeilen gleichzeitig+1
        rows_count +=1
        #Zeilenumbrüche am Zeilenende entfernen
        toplog_line = toplog_line.rstrip()

        #Wenn nur Zeilenumbrüche vorliegen, fahren Sie mit der nächsten Zeile fort
        if not toplog_line :
            continue

        #Fügen Sie eine Zeitstempelzeile zur Liste hinzu und fahren Sie mit der nächsten Zeile fort
        if r_top_timestamp.search(toplog_line) != None:
            print(toplog_line)
            tmp_timestamp = r_top_timestamp.search(toplog_line).group(1)
            #Ein TOP-Befehlsergebnis, Initialisierung der Zeilenanzahl
            rows_count = 1
            continue

        #Extrahieren Sie für Prozesszeilen, wenn der Benutzer übereinstimmt
        if rows_count >= process_row_start:
            column_number = 0
            row_data = toplog_line.split(" ")
            #Zeitstempel einstellen
            tmp_output_csv_list = [tmp_timestamp]

            #Wiederholen Sie bis zum Ende der Zeile
            for column_data in row_data:
                if column_data =="":
                    #Wenn leer, fahren Sie mit der nächsten Spalte fort
                    continue
                column_number += 1

                #Fügen Sie die Daten in die Spalte BEFEHL in der tmp-Liste ein
                if column_number <= command_column :
                    tmp_output_csv_list.append(column_data)
                else :
                    continue

                #Überprüfen Sie, ob es sich um einen zu extrahierenden Datensatz handelt
                #Extraktionsziel BENUTZER oder Benutzer_Wenn kein Array angegeben ist Wählen Sie den zu extrahierenden Datensatz aus
                if column_number == user_column :
                    user_key_flg = True
                    for key_user in user_array:
                        #Extraktionsziel BENUTZER oder Benutzer_Datensatz, der extrahiert werden soll, wenn kein Array angegeben ist
                        if ( str(column_data) == key_user ):
                            user_key_flg = True
                            break
                        else:
                            user_key_flg = False

                    if user_key_flg == True :
                        pass
                    else:
                        break
            # for-sonst: Nur dann zur CSV-Extraktionsliste hinzufügen, wenn die Bedingungen erfüllt sind
            else:
                output_csv_list.append(tmp_output_csv_list)

5. Ausgabe der CSV-Datei

csv Gibt den Inhalt der Extraktionsliste output_csv_list an csv aus.

.py


    #CSV-Export
    csv_header = ['timestamp','USER','PR','NI','VIRT','RES','SHR','%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)   

csv_writer = csv.writer (f, delimiter = ',', lineterminator = '\ n'), delimiter = ',', Wenn Sie delimiter = '\ t' setzen, handelt es sich auch um eine tsv-Datei (tabulatorgetrennte Datei). wie es Dir gefällt.

Zusammenfassung des Quellcodes

.py


'''
Extrahieren Sie die Prozesszeile des Befehls Top mit USER und geben Sie sie in die CSV-Datei aus
timestamp,USER,PR,NI,VIRT,RES,SHR,%CPU,%MEM,TIME+,COMMAND
'''

# -*- coding: utf-8 
import re
import os
import csv

'''
Informationen einstellen
'''
#Zu extrahierender BENUTZER (Wenn nicht festgelegt, werden alle BENUTZER extrahiert.,Durch Trennzeichen festgelegt)
user_array =['apache','httpd']

#Holen Sie sich aktuelle Dir
current_dir = os.getcwd()
#Name der Eingabedatei(Full PATH)
input_file_name=f"{current_dir}\\before\\top.log"
#Name der Ausgabedatei(Full PATH)
output_file_name=f"{current_dir}\\after\\top.log"


#Position des Starts der Prozesszeile mit dem Befehl TOP
process_row_start = 8
#Position der USER-Spalte in der Prozesszeile mit dem Befehl TOP
user_column = 2
#Position der COMMAND-Spalte in der Prozesszeile mit dem Befehl TOP
command_column = 12

#regulärer Ausdruck des Zeitstempels
r_top_timestamp = re.compile("top - ([0-9:]+)+")

########Hauptverarbeitung#############
if __name__ == '__main__' :
    '''----------------------
toplog-Datei lesen
    ----------------------'''
    #Eingabedatei gelesen
    f = open(f"{input_file_name}", "r")
    toplog_lines = f.readlines()
    f.close()

    '''----------------------
Extraktion der Zeitstempellinie
    ----------------------'''
    timestamp_list = []
    roop_cnt = 0
    for toplog_line in toplog_lines :
        #Fügen Sie die Zeilennummer in das Array ein, wenn der Zeitstempel mit dem regulären Ausdruck übereinstimmt
        if r_top_timestamp.search(toplog_line) != None:
            timestamp_list.append(roop_cnt)
        roop_cnt += 1

    '''--------------------------
Extrahieren Sie den Prozess des Zielbenutzers
    --------------------------'''
    rows_count = 0
    tmp_timestamp = ''
    tmp_output_csv_list = []
    output_csv_list = []

    for toplog_line in toplog_lines :
        #Zählen Sie die Anzahl der TOP-Zeilen gleichzeitig+1
        rows_count +=1
        #Zeilenumbrüche am Zeilenende entfernen
        toplog_line = toplog_line.rstrip()

        #Wenn nur Zeilenumbrüche vorliegen, fahren Sie mit der nächsten Zeile fort
        if not toplog_line :
            continue

        #Für Zeitstempellinien zur Liste hinzufügen
        if r_top_timestamp.search(toplog_line) != None:
            print(toplog_line)
            tmp_timestamp = r_top_timestamp.search(toplog_line).group(1)
            #Ein TOP-Befehlsergebnis, Initialisierung der Zeilenanzahl
            rows_count = 1
            continue

        #Extrahieren Sie für Prozesszeilen, wenn der Benutzer übereinstimmt
        if rows_count >= process_row_start:
            column_number = 0
            row_data = toplog_line.split(" ")
            #Zeitstempel einstellen
            tmp_output_csv_list = [tmp_timestamp]

            #Wiederholen Sie bis zum Ende der Zeile
            for column_data in row_data:
                if column_data =="":
                    #Wenn leer, fahren Sie mit der nächsten Spalte fort
                    continue
                column_number += 1

                #Fügen Sie die Daten in die Spalte BEFEHL in der tmp-Liste ein
                if column_number <= command_column :
                    tmp_output_csv_list.append(column_data)
                else :
                    continue

                #Überprüfen Sie, ob es sich um einen zu extrahierenden Datensatz handelt
                #Extraktionsziel BENUTZER oder Benutzer_Datensatz, der extrahiert werden soll, wenn kein Array angegeben ist
                if column_number == user_column :
                    user_key_flg = True
                    for key_user in user_array:
                        #Extraktionsziel BENUTZER oder Benutzer_Datensatz, der extrahiert werden soll, wenn kein Array angegeben ist
                        if ( str(column_data) == key_user ):
                            user_key_flg = True
                            break
                        else:
                            user_key_flg = False

                    if user_key_flg == True :
                        pass
                    else:
                        break
            #Wenn die for-Anweisung durch etwas anderes als break beendet wird, fügen Sie sie der CSV-Extraktionsliste hinzu.
            else:
                output_csv_list.append(tmp_output_csv_list)


    '''--------------------------
Datei schreiben
    --------------------------'''
    #CSV-Export
    csv_header = ['timestamp','USER','PR','NI','VIRT','RES','SHR','%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)

das ist alles.

Impressionen

Ich hoffe, dass es keine Tools gibt und nur die TOP-Befehlsergebnisse übergeben werden, was die Belastung für diejenigen verringert, die angeblich "sammeln".

Recommended Posts

Extrahieren Sie das Ergebnis des TOP-Befehls mit USER und geben Sie es als CSV aus
Extrahieren Sie das Bigquery-Dataset und die Tabellenliste mit Python und geben Sie es in CSV aus
Lesen Sie JSON mit Python und geben Sie CSV aus
Geben Sie das Ausgabeergebnis von sklearn.metrics.classification_report als CSV-Datei aus
Lesen Sie die CSV-Datei mit dem Jupiter-Notizbuch und schreiben Sie die Grafik übereinander
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Drücken Sie den obersten Befehl mit htop
Scraping der veröffentlichten CSV mit Github Action und Veröffentlichung auf Github Pages
Konvertieren Sie eine Tabelle in CSV und laden Sie sie mit Cloud-Funktionen in den Cloud-Speicher hoch
Lesen Sie die CSV-Datei mit Python und konvertieren Sie sie unverändert in DataFrame
Geben Sie den Bericht mit Python aus DB in PDF aus, hängen Sie ihn automatisch an eine E-Mail an und senden Sie ihn
Schaben Sie den Holojour ab und zeigen Sie ihn in der CLI an
Lesen Sie die CSV-Datei und zeigen Sie sie im Browser an
Extrahieren Sie Dateien mit dem Befehl scp aus dem EC2-Speicher
Lesen Sie die json-Datei mit Python, formatieren Sie sie und geben Sie json aus
Führen Sie einen Befehl auf dem Webserver aus und zeigen Sie das Ergebnis an
POST das Bild mit json und erhalte es mit der Flasche
Extrahieren Sie den Maximalwert mit Pandas und ändern Sie diesen Wert
Als Ergebnis der Montage und Abstimmung mit POH! Lite
[Python] Lesen Sie die CSV-Datei und zeigen Sie die Abbildung mit matplotlib an
In Python werden die Elemente in der Liste sortiert und als Elemente und Vielfache ausgegeben.
Überprüfen Sie den Betriebsstatus des Servers mit dem Linux-Befehl top
Geben Sie das Ergebnis der Gradientenabstiegsmethode als Matplotlib-Animation aus
[Python] Was ist Pip? Erläutern Sie die Befehlsliste und deren Verwendung anhand aktueller Beispiele
[Python] So kratzen Sie eine lokale HTML-Datei und geben sie mit Beautiful Soup als CSV aus
Extrahieren Sie Twitter-Daten mit CSV
CSV-Daten extrahieren und berechnen
Gewähren Sie mit dem Befehl curl ein Zugriffstoken und POSTEN Sie die API
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
Konvertieren Sie das Ergebnis von Python Optparse, um es zu diktieren und zu verwenden
Datenbanktabellen mit CSV extrahieren [ODBC-Verbindung von R und Python]
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).