ubuntuusers.de

Zahlen in Datei auswerten und Datei dann ändern

Status: Ungelöst | Ubuntu-Version: Ubuntu 23.10 (Mantic Minotaur)
Antworten |

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:

1
2
3
$ 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

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 131

seahawk1986 schrieb:

Da könnte man z.B. awk bemühen:

1
2
3
$ 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 Team-Icon

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:

1
2
3
$ 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

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 131

@rklm

Vielen Dank 👍 😀

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:

1
2
3
$ 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:

1
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:

1
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:

1
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:

1
2
3
4
5
$ 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

1
2
3
4
5
$ ./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

Avatar von 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

1
2
3
4
5
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
Antworten |