BrauchHilfe
Anmeldungsdatum: 24. April 2024
Beiträge: Zähle...
|
Hallo,
ich möchte meinen NAS Plattenplatz überwachen. Hab schon ein Skript um den Plattenplatz meiner beiden NAS Systeme anzuzeigen....das sieht dann so aus: #cat nas_free.txt
NAS1 500 100 80
NAS2 600 300 50
Spalte 1 = Name vom NAS
Spalte 2 = Größe Plattenplatz
Spalte 3 = freier Plattenplatz
Spalte 4 = belegt in % Und jetzt möchte ich diese Zahlen ins Monitoring bringen, allerdings soll dann eine Änderung erfolgen. Ich möchte nämlich die Spalte 4 "belegt in %" gleich umbauen, d.h. die Datei soll dann wie folgt aussehen. NAS1 500 100 80 WARNING
NAS2 600 300 50 OK ...also ab 80 % belegt, soll WARNING mit die die Datei geschrieben werden. Ich möchte das ganz normal mit Bash Skript lösen, komm aber nicht drauf wie ich das nun machen kann. Könnt ihr mir da bitte helfen? Bearbeitet von sebix: Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern! Bearbeitet von Thomas_Do: Apostroph aus Titel entfernt.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11229
Wohnort: München
|
Da könnte man z.B. awk bemühen:
| $ awk '{if ($4 >= 80) {$5="WARNING"} else $5="OK"; print}' nas_free.txt
NAS1 500 100 80 WARNING
NAS2 600 300 50 OK
|
|
BrauchHilfe
(Themenstarter)
Anmeldungsdatum: 24. April 2024
Beiträge: 5
|
Vielen vielen Dank aus Nürnberg ☺
Du hast mir echt den Tag gerettet...klappt super gut!
|
CarstenHa
Anmeldungsdatum: 1. Mai 2020
Beiträge: 131
|
seahawk1986 schrieb: Da könnte man z.B. awk bemühen:
| $ awk '{if ($4 >= 80) {$5="WARNING"} else $5="OK"; print}' nas_free.txt
NAS1 500 100 80 WARNING
NAS2 600 300 50 OK
|
@seahawk1986 Ich hätte mal eine Frage dazu. Ich kenne mich besser mit sed aus als mit awk. Deswegen ist das ganz interessant. Angenommen ich habe eine Datei mit mehreren unterschiedlichen Auswertungen, wie mache ich das mit awk das er nur die Zeilen mit NAS1 und NAS2 auswertet? Gruß Carsten
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13075
|
CarstenHa schrieb:
Ich hätte mal eine Frage dazu. Ich kenne mich besser mit sed aus als mit awk. Deswegen ist das ganz interessant. Angenommen ich habe eine Datei mit mehreren unterschiedlichen Auswertungen, wie mache ich das mit awk das er nur die Zeilen mit NAS1 und NAS2 auswertet?
z.B. so: | $ awk '/^NAS[12]/ {if ($4 >= 80) {$5="WARNING"} else $5="OK"; print}' nas_free.txt
$ awk '$1 ~ /^NAS[12]$/ {if ($4 >= 80) {$5="WARNING"} else $5="OK"; print}' nas_free.txt
$ awk '$1 == "NAS1" || $1 == "NAS2" {if ($4 >= 80) {$5="WARNING"} else $5="OK"; print}' nas_free.txt
|
|
CarstenHa
Anmeldungsdatum: 1. Mai 2020
Beiträge: 131
|
|
userthm100
Anmeldungsdatum: 10. Juli 2019
Beiträge: Zähle...
|
Wie sieht es eigentlich aus, wenn man ab 80% ein Warnung (ist ja schon gelöst), ab 90% ein “KRITISCH” und den Rest dann mit “OK” ausgeben will?
|
BrauchHilfe
(Themenstarter)
Anmeldungsdatum: 24. April 2024
Beiträge: 5
|
CarstenHa schrieb: seahawk1986 schrieb: Da könnte man z.B. awk bemühen:
| $ awk '{if ($4 >= 80) {$5="WARNING"} else $5="OK"; print}' nas_free.txt
NAS1 500 100 80 WARNING
NAS2 600 300 50 OK
|
@seahawk1986 Ich hätte mal eine Frage dazu. Ich kenne mich besser mit sed aus als mit awk. Deswegen ist das ganz interessant. Angenommen ich habe eine Datei mit mehreren unterschiedlichen Auswertungen, wie mache ich das mit awk das er nur die Zeilen mit NAS1 und NAS2 auswertet? Gruß Carsten
Hi Carsten,
kann man dem awk noch einen Exitcode mitgeben? Ich spiel gerade noch mit Icinga und da braucht man noch einen Exitcode ....
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
... kann man dem awk noch einen Exitcode mitgeben ...
Ja, mit dem "exit" Befehl. Wie sieht es eigentlich aus, wenn man ab 80% ein Warnung (ist ja schon gelöst), ab 90% ein “KRITISCH” und den Rest dann mit “OK” ausgeben will?
Ich habe mal ein Array mit Werten und Text verwendet:
$ awk 'BEGIN{split("25|Normal,80|Warning,90|Kritisch",arr,",")}{$5="OK";for(i in arr){split(arr[i],a,"|");if($4>=a[1]){$5=a[2]}};print}END{exit 123}' nas_free.txt
NAS1 500 100 80 Warning
NAS2 600 300 50 Normal
NAS3 700 55 92 Kritisch
NAS4 1000 800 20 OK
$ echo $?
123
$
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11229
Wohnort: München
|
BrauchHilfe schrieb: kann man dem awk noch einen Exitcode mitgeben? Ich spiel gerade noch mit Icinga und da braucht man noch einen Exitcode ....
Ja: https://www.gnu.org/software/gawk/manual/html_node/Exit-Statement.html - aber jeder Prozess beendet sich mit dem Exit-Code 0, wenn es keine Fehler gab, ohne dass man dafür etwas tun muss. userthm100 schrieb: Wie sieht es eigentlich aus, wenn man ab 80% ein Warnung (ist ja schon gelöst), ab 90% ein “KRITISCH” und den Rest dann mit “OK” ausgeben will?
Da muss man die if-Statements nur etwas verschachteln: | awk '$1 ~ /^NAS[12]$/ {if ($4 >= 90) {$5="CRITICAL"} else { if ($4 >=80) {$5="WARNING"} else $5="OK" }; print}' nas_free.txt
|
|
san04
Anmeldungsdatum: 19. Januar 2010
Beiträge: 1238
|
seahawk1986 schrieb: | awk '$1 ~ /^NAS[12]$/ {if ($4 >= 90) {$5="CRITICAL"} else { if ($4 >=80) {$5="WARNING"} else $5="OK" }; print}' nas_free.txt
|
Spricht etwas gegen else if ? Das wäre mir jetzt zuerst in den Sinn gekommen:
| awk '$1 ~ /^NAS[12]$/ {if ($4 >= 90) {$5="CRITICAL"} else if ($4 >=80) {$5="WARNING"} else $5="OK"; print}' nas_free.txt
|
|
BrauchHilfe
(Themenstarter)
Anmeldungsdatum: 24. April 2024
Beiträge: 5
|
Hallo,
ich bin auf einem ganz guten Weg. Sieht so bei mir aus. Raw Datei mit den NAS Werten:
| $ cat nbdevquery1.txt
V_6_ OST_N_Pool NAS _PhysicalLSU @aaaax 712461.77 213294.57 99 1 0 1 0 1 14 0 0 0
V_6_ OST_S_Pool NAS _PhysicalLSU @aaaa1 712461.77 212883.59 70 1 0 1 1 2 14 0 0 0
V_6_ OST_N_Pool2 NAS _PhysicalLSU @aaaa5 712461.77 196844.52 81 0 1 1 1 14 0 0 0
V_6_ OST_S_Pool2 NAS _PhysicalLSU @aaaa9 712461.77 267027.98 62 1 0 1 0 2 14 0 0 0
|
Mein Skript :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 | #!/bin/bash
Help()
{
# Display Help
echo "Monitoring Capacity of NAS Storage"
echo
echo "Syntax: scriptTemplate [-q|h]"
echo "options:"
echo "-q insert on of the NAS devices - NAS01 ... NAS04"
echo "-h Print this Help."
echo
}
# echo "Main"
while getopts ":hq:" option; do
case $option in
h) # display Help
Help
exit;;
q) # Enter a name of the NAS
Name=$OPTARG;;
*) # Invalid option
echo "Error: Invalid option"
Help
exit;;
esac
done
if [ "$Name" = "" ]; then
Name=NAS
fi
# echo "hello $Name"
cat nbdevquery1.txt |awk '{
gsub("V_6_ OST_N_Pool NAS _PhysicalLSU @aaaax", "NAS01")
gsub("V_6_ OST_S_Pool NAS _PhysicalLSU @aaaa1", "NAS02")
gsub("V_6_ OST_N_Pool2 NAS _PhysicalLSU @aaaa5", "NAS03")
gsub("V_6_ OST_S_Pool2 NAS _PhysicalLSU @aaaa9", "NAS04");
if ($4 >= 90) {$5="CRITICAL"} else { if ($4 >=80) {$5="WARNING"} else $5="OK" }
print $5" - "$1" - "$4" % used Capacity out of "$2/1024" TiB|free Capacity in TiB="$3/1024";"$2/1024*0.2";"$2/1024*0.1}'|grep $Name
exit
|
Aufruf Skript mit Angabe einer NAS | $ ./check_nas_capacity_v6.sh -q NAS01
CRITICAL - NAS01 - 99 % used Capacity out of 695.763 TiB|free Capacity in TiB=208.295;139.153;69.5763
$ echo $?
0
|
So wird das Skript dann auch von Icinga aufgerufen und es erstellt mir auch einen schönen Graphen....Juhu! Kann mir jetzt noch jemand helfen mit den Exitcodes? Wenn die Capacity "OK" ist, soll ein Exit=0 geschrieben werden und bei Capacity "WARNING" ein Exit=1 und bei Capacity "CRITICAL" ein Exit=2 ...macht schon irgendwie Spaß ☺ Bearbeitet von rklm: Syntaxhighlighting. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!
|
shiro
Anmeldungsdatum: 20. Juli 2020
Beiträge: 1214
|
Wenn die Capacity "OK" ist, soll ein Exit=0 geschrieben werden und bei Capacity "WARNING" ein Exit=1 und bei Capacity "CRITICAL" ein Exit=2
Prinzipiell hatte ich das ja in meinem Post bereits beschrieben. Da du aber nach dem Exit von "awk" noch weitere Programme in der Pipe verarbeiten möchtest, lohnt ein "$?" nicht, da hier stets der letzte Exit-Code ausgegeben wird. Man könnte zwar die Selektion hinsichtlich $Name vorher machen und das "awk" am Ende mit dem "exit" den Code setzten, aber da du es anders haben willst, geht dies auch wie folgt:
$ cat nbdevquery1.txt |awk '{ ...
if ($4 >= 90) {$5="CRITICAL";e=2} else { if ($4 >=80) {$5="WARNING";e=1} else {$5="OK";e=0} }; print "..."}END{exit e}' | grep $Name
$ echo ${PIPESTATUS[1]}
Der PIPESTATUS[0] wäre des Status von "cat", PIPESTATUS[1] der Exit-Code von "awk" und PIPESTATUS[2] der Exit-Code von "grep".
|
homer65
Anmeldungsdatum: 8. November 2005
Beiträge: 570
Wohnort: bochum, germany
|
Oder man nimmt ein Python Skript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | rc = 0
with open("nas_free.txt") as datei:
for satz in datei:
worte = satz.split(" ")
test = int(worte[3].rstrip())
if test >= 90:
awort = 'KRITISCH'
rc = 2
elif test >= 80:
awort = 'WARNING'
if rc < 2:
rc = 1
else:
awort = 'OK'
print(worte[0] + " " + worte[1] + " " + worte[2] + " " + awort)
exit(rc)
|
|
userthm100
Anmeldungsdatum: 10. Juli 2019
Beiträge: 6
|
homer65 schrieb: Oder man nimmt ein Python Skript
| rc = 0
with open("nas_free.txt")
………
print(worte[0] + " " + worte[1] + " " + worte[2] + " " + awort)
exit(rc)
|
Python….das klingt interessant. Wie macht man in Python, das was ich in meinem Skript mit awk gsub mache? Ich muss halt erst mal ein vorhandene Datei so abändern, dass für ,ich paßt. Um das geht es mir cat nbdevquery1.txt |awk '{
gsub("V_6_ OST_N_Pool NAS _PhysicalLSU @aaaax", "NAS01")
gsub("V_6_ OST_S_Pool NAS _PhysicalLSU @aaaa1", "NAS02")
gsub("V_6_ OST_N_Pool2 NAS _PhysicalLSU @aaaa5", "NAS03")
gsub("V_6_ OST_S_Pool2 NAS _PhysicalLSU @aaaa9", "NAS04");
if ($4 >= 90) {$5="CRITICAL"} else { if ($4 >=80) {$5="WARNING"} else $5="OK" }
print $5" - "$1" - "$4" % used Capacity out of "$2/1024" TiB|free Capacity in TiB="$3/1024";"$2/1024*0.2";"$2/1024*0.1}'|grep $Name
exit
|