
Ich habe ein Skript erstellt, das eine Protokolldatei anzeigt und nach einer bestimmten Anzahl von Millisekunden/Sekunden grepst. Ich habe etwas erstellt, das den Mindest- und Höchstwert anzeigt, ich muss jedoch den Durchschnitt der Liste ermitteln.
logdir_8080='/opt/product/apachetomcat/8.5.5_8080/logs'
cd "$logdir_8080"
get_file=`ls -rt localhost_access_log.*.txt|tail -1`
cat $get_file | tail -1000 | grep "objectId" | awk -F 'HTTP/1.1" 200' '{
print $2}'|awk -F' ' '{ print $2 }' | sort - n>/opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt
Mindestwert:
cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|head -1
max_Wert:
cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|tail -1
Idee der Liste:
233
249
283
283
302
303
332
333
643
851
965
965
972
1022
1135
1182
1213
1232
1264
1273
1390
1403
1414
1429
1474
1537
1540
1543
1545
1556
1565
1566
1577
1589
1591
1599
1602
1621
1622
1647
1653
1705
1740
1772
1774
1933
1935
1983
1990
Wie ermittelt man den Durchschnitt?
Antwort1
Wenn Ihre Datei nur Zahlen enthält, können Sie mit einem einzigen awk-Befehl alles abrufen.
awk 'BEGIN {themin=10000000; themax=0; thecount=0; thesum=0}
{for (i=1; i<=NF; i++) {
thesum += $i;
thecount++;
if ($i < themin) {themin = $i}
if ($i > themax) {themax = $i}
}}
END {
printf("The min is %d\nThe max is %d\nThe sum is %d\nThe total number of items is %d\nThe average of those items is %d\n", themin, themax, thesum, thecount, int(thesum/thecount))
}' _file_
Ich habe es aufgeteilt, damit Sie die verschiedenen Abschnitte sehen können.
Der BEGIN initialisiert lediglich alle zu verwendenden Variablen. Die Variable themin kann auf jeden beliebigen Wert gesetzt werden, solange sie größer ist als alles in Ihrer Datei.
Der mittlere Teil durchläuft einfach jede Zeile und jedes Feld in dieser Zeile. Er summiert die Zahlen und ermittelt die Anzahl aller Zahlen, sodass am Ende eine einfache Division durchgeführt werden kann. Die beiden if-Anweisungen erfassen Ihre Mindest- und Höchstwerte.
Das END druckt alle relevanten Informationen aus, einschließlich Ihrer Mindest-, Höchst- und Durchschnittswerte.
Hoffe das hilft.
Antwort2
Sie müssen keine eigenen Lösungen für Probleme schreiben, für die es bereits hervorragende Lösungen gibt. Schließlich haben Sie bei SuperUser und nicht bei StackOverflow gefragt.
Verwenden Sie beispielsweise GNUdatamash
$ datamash min 1 max 1 mean 1 < yourFile
233 1990 1272.0408163265
oder verwenden Sie die Tools aus dem Paketnum-utils
$ numbound -l yourFile
233
$ numbound yourFile
1990
$ numaverage yourFile
1272.04081632653