[LINUX] [Shell-Skript] Berechnen und geben Sie die verstrichene Zeit nur aus der Protokolldatei von START und END aus

Ich möchte die Start- und Endzeiten aus der Protokolldatei extrahieren und in einer Tabelle zusammenfassen

Angenommen, die folgende Protokolldatei wird für jeden Job generiert, der die Tabelle lädt

TABLENAME1_load.log


# iroiro
2020-08-28 00:01:00 DATA LOAD START !!!
2020-08-28 00:03:00 DATA LOAD NORMAL END !!!
# iroiro

TABLETAME2_load.log


# iroiro
2020-08-28 00:01:00 DATA LOAD START !!!
2020-08-28 00:10:00 DATA LOAD NORMAL END !!!
# iroiro

Ich möchte dies für Folgendes gemeinsam ausgeben

result


JOBNAME      START     END       TIME(s)  TIME(m)
TABLENAME1   00:01:00  00:03:00  120      2
TABLENAME2   00:01:00  00:10:00  540      9
...

Methode

Überblick

Ich werde mein Bestes geben, um alles mit Shell zu vervollständigen!

INPUT

--Datum (JJJJMTT) --Datei mit Ladeauftragsliste (jobs.txt)

jobs.txt


TABLENAME1
TABLENAME2
TABLENAME3

shell:TABLENAME1_load.20200828000100.log


# iroiro
2020-08-28 00:01:00 DATA LOAD START !!!
2020-08-28 00:10:00 DATA LOAD NORMAL END !!!
# iroiro

shell:TABLENAME2_load.20200828000100.log


# iroiro
2020-08-28 00:01:00 DATA LOAD START !!!
2020-08-28 00:13:00 DATA LOAD NORMAL END !!!
# iroiro

shell:TABLENAME3_load.20200828000200.log


# iroiro
2020-08-28 00:01:00 DATA LOAD START !!!
2020-08-28 00:20:00 DATA LOAD NORMAL END !!!
# iroiro

OUTPUT --Tabelle von JOBNAME, START, ENDE, ZEIT (en), ZEIT (m)

Prozessablauf

P0.Temporäre Textdatei(JOBNAME, START, END, TIME(s), TIME(m)Zum Header)Erstellen
P1. jobs.Für jeden einzeiligen Ladejob in txt
    P1.1.Überprüfen Sie, ob eine Protokolldatei vorhanden ist
    P1.2.Extrahieren Sie die Zeile mit den START- und END-Zeiten aus der Protokolldatei
    P1.3.Extrahieren Sie den Zeitteil und beginnen Sie\Weisen Sie eine Variable in Form von tEND zu
    P1.4. start,Speichern Sie das Ende in einer Variablen
    P1.5.verstrichene Zeit(Sekunden)In einer Variablen
    P1.6.verstrichene Zeit(Protokoll)In einer Variablen
    P1.7. 4,5,Speichern Sie 6 in einer Zeile der Textdatei
P1.8.Wenn alle Ladejobs abgeschlossen sind, erfolgt die Ausgabe in tabellarischer Reihenfolge in absteigender Reihenfolge der verstrichenen Zeit
P1.9.Temporäre Textdatei löschen

Was zu verwenden

terminal


$ ls -l
sample.sh
jobs.txt
log/

$ cat jobs.txt
TABLENAME1
TABLENAME2
TABLENAME3

$ ls -l log/
20200828/
20200829/

$ ls -l log/20200828/
TABLENAME1_load.20200828000100.log
TABLENAME2_load.20200828000100.log
TABLENAME3_load.20200828000100.log
TABLENAME3_load.20200828000200.log

Ganzer Code

sample.sh


#!/bin/sh

# Get the jobname from txt file
jobs=($(cat $2))

# Create tmp file with table header
echo JOBNAME START END 'TIME(s)' 'TIME(m)'  >> tmp_result.txt

for x in ${jobs[@]};
do
	if [ "$(ls log/$1/${x}_load.*)" != '' ]; then
		# Extract START and END from log file
		result=$(ls log/$1/${x}_load.* | tail -n 1 | xargs cat | grep "DATA LOAD" | cut -d' ' -f2 | echo $(tr '\n' '\t'))
		start=$(cut -d' ' -f 1 <<< $result)
		end=$(cut -d' ' -f 2 <<< $result)
		# Calc processing time
		time_s=$(expr `date -d$end +%s` - `date -d$start +%s`)
		time_m=$((time_s/60))
		# Save into txt file
		echo $x $start $end $time_s $time_m >> tmp_result.txt
	else
		echo 'there is no log file'
	fi
done 2> /dev/null

# Display result
(head -n +1 tmp_result.txt && tail -n +2 tmp_result.txt | sort -n -r -k 5) | column -t

# Remove tmp file
rm tmp_result.txt

Ergebnis

――Es scheint, dass Sie die verstrichene Zeit für jeden Job kennen und verstehen können, welcher Job verbessert werden sollte.

terminal


$ sh sample.sh 20200828 jobs.txt
JOBNAME     START     END       TIME(s)  TIME(m)
TABLENAME3  00:01:00  00:20:00  1140     19
TABLENAME2  00:01:00  00:13:00  720      12
TABLENAME1  00:01:00  00:10:00  540      9

Verarbeitungsdetails

Lesen Sie jobs.txt und verwenden Sie es für die Anweisung

sample.sh


#!/bin/sh
# get the jobname from txt file
jobs=($(cat $1))
for x in ${jobs[@]};
do
        echo $x
done

terminal


$ sh sample.sh jobs.txt
TABLENAME1
TABLENAME2
TABLENAME3
P0. Erstellen Sie eine temporäre Textdatei (mit JOBNAME, START, END, TIME (s), TIME (m) als Header).

sample.sh


echo JOBNAME START END 'TIME(s)' 'TIME(m)'  >> tmp_result.txt
P1.1 Überprüfen Sie, ob eine Protokolldatei vorhanden ist

sample.sh


#!/bin/sh
# --
for x in ${jobs[@]};
do
	if [ "$(ls log/$1/${x}_load.*)" != '' ]; then
		echo 'log file: ' $x
	else
		echo 'there is no log file'
	fi
done

terminal


$ sh sample.sh 20200828 jobs.txt
log file:  TABLENAME1
log file:  TABLENAME2
log file:  TABLENAME3
P1.2. Extrahieren Sie die Zeile mit den START- und END-Zeiten aus der Protokolldatei

--list Protokolldatei --Wenn mehrere Protokolldateien vorhanden sind, nehmen Sie die neueste - tail -n 1 --Katzen Sie den Inhalt - xargs cat

sample.sh


ls log/$1/${x}_load.* | tail -n 1 | xargs cat | grep "DATA LOAD" | cut -d' ' -f2 

terminal


$ sh sample.sh 20200828 jobs.txt
00:01:00 # TABLE1 START
00:10:00 # TABLE2 END
00:01:00 # TABLE2 START
00:13:00 # TABLE2 END
00:01:00 # TABLE3 START
00:20:00 # TABLE3 END

Jetzt können Sie für jeden Job HH: mm: dd von START und END erhalten.

P1.3. Extrahieren Sie den Zeitteil und weisen Sie ihn einer Variablen im Format START \ tEND zu

sample.sh


for x in ${jobs[@]};
do
	if [ "$(ls log/$1/${x}_load.*)" != '' ]; then
		result=$(ls log/$1/${x}_load.* | tail -n 1 | xargs cat | grep "DATA LOAD" | cut -d' ' -f2 | echo $(tr '\n' '\t'))
		echo $result
	else
		echo 'there is no log file'
	fi
done

terminal


$ sh sample.sh 20200828 jobs.txt
00:01:00 00:10:00 # TABLENAME1
00:01:00 00:13:00 # TABLENAME2
00:01:00 00:20:00 # TABLENAME3
P1.4. Start und Ende in Variablen speichern

sample.sh


	if [ "$(ls log/$1/${x}_load.*)" != '' ]; then
		result=$(ls log/$1/${x}_load.* | tail -n 1 | xargs cat | grep "DATA LOAD" | cut -d' ' -f2 | echo $(tr '\n' '\t'))
		start=$(cut -d' ' -f 1 <<< $result)
		end=$(cut -d' ' -f 2 <<< $result)
	else
		echo 'there is no log file'
	fi
P1.5. Verstrichene Zeit (Sekunden) wird in einer Variablen gespeichert, P1.6. Verstrichene Zeit (Minuten) wird in einer Variablen gespeichert

--Konvertieren Sie in die UNIX-Zeit, um die Differenz zwischen HH: mm: ss zu berechnen - date -dstart +%s - date -dend +%s

sample.sh


time_s=$(expr `date -d$end +%s` - `date -d$start +%s`)
time_m=$((time_s/60))

terminal


$ expr `date -d'00:01:01' +%s` - `date -d'00:00:01' +%s`
60
P1.7. Speichern Sie 4,5,6 in einer Zeile der Textdatei

sample.sh


echo $x $start $end $time_s $time_m >> tmp_result.txt
P1.8. Wenn alle Ladejobs abgeschlossen sind, wird die Ausgabe in tabellarischer Reihenfolge in absteigender Reihenfolge der verstrichenen Zeit ausgeführt.

――Die erste Zeile ist eine Kopfzeile und kann daher nicht sortiert werden. - head -n +1 tmp_result.txt && --Sortieren Sie in absteigender Reihenfolge mit der 5. Spalte "TIME (m)" als Schlüssel ab der 2. Zeile. - tail -n +2 tmp_result.txt | sort -n -r -k 5

sample.sh


(head -n +1 tmp_result.txt && tail -n +2 tmp_result.txt | sort -n -r -k 5) | column -t
P1.9. Löschen Sie die temporäre Textdatei

sample.sh


rm tmp_result.txt 

abschließend

Ich würde gerne mit dem Shell-Skript beginnen, und wenn Sie Meinungen dazu haben, wie Sie besser schreiben können, würde ich es begrüßen, wenn Sie mich wissen lassen könnten.

Referenz

Recommended Posts

[Shell-Skript] Berechnen und geben Sie die verstrichene Zeit nur aus der Protokolldatei von START und END aus
Geben Sie die Start- und Endpositionen der Dateien an, die in qiitap enthalten sein sollen
Geben Sie dem Befehl history ein Datum und eine Uhrzeit ein und sammeln Sie Verlaufsdateien aller Benutzer mit einem Skript