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
...
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)
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
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
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
――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
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
sample.sh
echo JOBNAME START END 'TIME(s)' 'TIME(m)' >> tmp_result.txt
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
--list Protokolldatei
--Wenn mehrere Protokolldateien vorhanden sind, nehmen Sie die neueste
- tail -n 1
--Katzen Sie den Inhalt
- xargs cat
grep "DATA LOAD"
cut -d' ' -f2
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.
tr '\n' '\t'
result=$(process | process | process)
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
start=$(cut -d' ' -f 1 <<< $result)
end=$(cut -d' ' -f 2 <<< $result)
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
--Konvertieren Sie in die UNIX-Zeit, um die Differenz zwischen HH: mm: ss
zu berechnen
- date -d
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
sample.sh
echo $x $start $end $time_s $time_m >> tmp_result.txt
――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
column -t
sample.sh
(head -n +1 tmp_result.txt && tail -n +2 tmp_result.txt | sort -n -r -k 5) | column -t
sample.sh
rm tmp_result.txt
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.
Recommended Posts