Sie sind nicht angemeldet.

1

27.11.2006, 06:11

[gelöst] nach Inhalt in einer Datei oder Variabeln suchen

Hallo zusammen

Habe ein kleines Problem. Ich muss noch dazu sagen, dass ich erst mit bash begonnen habe zu programieren. Ich bin also noch nicht so erfahren.

Ich habe in einer Datei oder einer Variabel mehrere Zahlen (die Anzahl ändert sich bei jeder Ausführung des Skriptes).

In der Datei sieht es zum Beispiel so aus:


12
16
03

17

In der Variabel sieht es so aus:

12 16 03 17

(wie gesagt die Anzahl der Zahlen kan sich ändern!)

Ich suche nun ein Befehlt, der den Inhalt der Variabel oder besser noch der Datei nach einer Zahl sucht die >=24 ist.

Welchen Befehl kann ich da nutzen.

Mit test -ge funktioniert das nicht (zu viele Zahlen).

Besten Dank für die rasche Hilfe

Gruss

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

27.11.2006, 06:22

RE: nach Inhalt in einer Datei oder Variabeln suchen

zb

Quellcode

1
2
3
4
5
6
7
8
#!/bin/bash
VARIABLE="12 14 18 23 33 45 34 77"
for ZAHL in $VARIABLE
do
 if [ $ZAHL -gt 24 ]; then
   echo "Die $ZAHL ist groesser als 24"
 fi
done


es können ja mehrere zahlen grösser sein, also kommt nur eine schleife in frage.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

3

27.11.2006, 10:15

RE: nach Inhalt in einer Datei oder Variabeln suchen

ach so, wenn die daten in einer datei testdatei liegen, dann geht das zb mit hilfe der kommandosubstitution

Quellcode

1
2
3
4
5
6
7
#!/bin/bash
for ZAHL in $( cat /pfad_da_hin/testdatei )
do
 if [ $ZAHL -gt 24 ]; then
  echo "Die $ZAHL ist groesser als 24"
 fi
done
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

4

28.11.2006, 16:17

Besten Dank für die Antwort.
Leider scheint es noch nicht zu funktionieren.
Ich habe bis jetzt folgendes:

#!/bin/bash
who -u | cut -c 40-41 > ewigerlogin.txt
for ZAHL in $( cat ewigerlogin.txt )
do
if [ $ZAHL -gt 24 ]; then
echo "Die $ZAHL ist groesser als 24"
fi
done

Was mache ich falsch?
Schön wäre es, wenn root eine nachricht erhält, wenn die Aussage wahr ist.

Wie muss ich das machen

Grüsse

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

5

28.11.2006, 18:49

bischen mehr musst du schon mitteilen.
kommt eine fehlermeldung oder gibt das script keine ausgabe?
was steht in der ewiglogin.txt denn nach der scriptausführung drin?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

6

28.11.2006, 19:10

Bei jeder Ausführung des skriptes sieht die txt Datei anders aus. --> Da who -u jedesmal andere Werte liefert.

Es kommt keine Ausgabe wenn das Skript zu ende ist.

Ich habe nun folgendes versucht:

#!/bin/bash
var1=`who -u | cut -c 40-41`

if [ $var1 -ge 24 ];
then echo $?
fi

Da kommt aber immer nur die Meldung: Zeile 4 zu viele Variablen.

Was muss das skript können:

Das Skript muss in regelmässigen Abständen automatisch alle eingelogten User überprüfen. Sobald jemand länger als 24h eingelogt ist, sollte der Root eine Nachricht erhalten.

who -u --> zeigt alle eingelogten User mit der Zeit an.
cut -c 40-41 --> schneidet bei der Zeitangaben die Stunden aus
Das sieht auf dem Bildschirm z.B. so aus: 22

12
00

16

var1= --> Hier speichere ich die angaben in die Variable 1.
Bildschirmausgabe: 22 12 00 16

if [ $var1 -ge 24 ] --> Müsste den Inhalt überprüfen ob eine Zahl >= 24 in der
Variablen vorhanden ist.

Ich denke das Problem ist das if [ ...] ein Problem bekommt
sobald mehrere Zahlen in der Var1 sind.

Ich hoffe du kannst mir Helfen!
Besten Dank

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

7

28.11.2006, 19:42

ich denke, dass problem ist der inhalt von ewiglogin, da keine zahl größer 24 ist
füge doch mal in die schleife eine echoanweidsung ein zb

Quellcode

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
who -u | cut -c 40-41 > ewigerlogin.txt
for ZAHL in $( cat ewigerlogin.txt )
do
if [ $ZAHL -gt 24 ]; then
 echo "Die $ZAHL ist groesser als 24"
else
 echo "Die $ZAHL ist nicht groesser als 24"
fi
done

den inhalt von ewiglogin kann ich nicht nachvollziehen, da who bei mir wahrscheinlich ein anderes format ausgibt.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

8

28.11.2006, 19:44

Zitat

Original von info-gate
Ich denke das Problem ist das if [ ...] ein Problem bekommt
sobald mehrere Zahlen in der Var1 sind.

dir zerlegung übernimmt for, wenn der inhalt der datei nach ausgabe mit cat expandiert wird.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

9

28.11.2006, 20:49

Super Danke jetzt geht es! :applaus:

Noch eine Frage.

Wie kann ich den Befehl Mail in mein Skript einbauen?

Im Terminal muss ich folgendes eingeben:

mail -s "ewige Logins" root
Es gibt User die länger als 24 Stunden
eingelogt sind.
$ZAHL
.
EOT

Wie kann ich das ins Skript einbrinngen?

Ich danke dir für deine schnelle und gute Hilfe.

Gruss

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

10

28.11.2006, 20:57

also erst mal kannst du who... etc in die forschleife einbauen, eine umleitung in eine datei istr nicht notwendig. das ganze sieht dann so aus

Quellcode

1
2
3
4
5
6
7
8
9
#!/bin/bash
for ZAHL in $( who -u | cut -c 40-41 )
do
if [ $ZAHL -gt 24 ]; then
 echo "Die $ZAHL ist groesser als 24"
else
 echo "Die $ZAHL ist nicht groesser als 24"
fi
done


und jetzt kannst du die ganze ausgabe nach mail umleiten, indem du die schleife in eine subshell packst (in klammern setzen) und die ausgabe mit einer pipe (senkrechter strich) nach mail umleitest. es muss nur noch subject und mailadresse angehängt werden. die echoanweisungen in der schleife müssen dann noch angepasst werden.

Quellcode

1
2
3
4
5
6
7
8
9
#!/bin/bash
( for ZAHL in $( who -u | cut -c 40-41 )
do
if [ $ZAHL -gt 24 ]; then
 echo "Die $ZAHL ist groesser als 24"
else
 echo "Die $ZAHL ist nicht groesser als 24"
fi
done) | mail -s "superlog"  ich@mailadresse.ich
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

11

28.11.2006, 21:26

Besten Dank

Ich möchte aber nur eine Mail versenden, wenn Es User gibt die länger als 24h eingelogt sind.

Kann ich das so machen

#!/bin/bash
for ZAHL in $( who -u | cut -c 40-41 )
do
if [ $ZAHL -gt 24 ]; then
(echo "Die $ZAHL ist groesser als 24") | mail -s "superlog" ich@mailadresse.ich
else
echo "Die $ZAHL ist nicht groesser als 24" > /dev/null
fi
done

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

12

28.11.2006, 21:34

ähemm, nein, so funktioniert das nicht, da in der variable ZAHL ja nur die zahl enthalten ist die mit cut ausgeschnitten wird, der username ist nicht enthalten. ich gehe mal davon aus, dass in der mail der username drin stehen soll, oder?
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

13

28.11.2006, 22:09

Das wäre sicherlich das einfachste. Es muss aber momentan nicht sein. Das kann ich dan auch noch später wenn ich mehr Zeit habe versuchen.

Wichtig ist erstmal, dass der Root eine Mail erhält wo drin steht, dass es user hat die länger als 24 Stunden eingelogt sind.

Dann muss er halt manuel kurz filtern.

Ich habe aber gemerkt, dass für jeden user der länger drin ist eine mail versendet wird. --> Ist eigentlich auch logisch

Das einfach nur eine Mail versendet wir (nur wenn es solche user hat) ist vermutlich nicht möglich oder?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

14

28.11.2006, 22:15

dann ist vorerst deine lösung mit dem mail kommando direkt hinter dem echo mit pipe ausreichend. dann wird eine mail für jeden user über 24 stunden verschickt . echo muss dazu micht in klammern (subshell) gesendet werden.

die andere lösung, die ich angekündigt habe, ist natürlich auch möglich. melde dich mal, wenn du wieder zeit hast (bei mir ist es momentan auch knapp) ich helfe dir gern.

machbar ist das alles und eigentlich kein problem.

wichtig ist, dass ich dein problem verstanden habe und das ist jetzt der fall. lass uns noch mal später darüber reden.
kannst mir auch eine pn schicken, wenn es so weit ist.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

15

28.11.2006, 22:17

Besten Dank

hast mir viel geholfen!
Habe auch einiges gelernt!

Gruss

Rico

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

16

28.11.2006, 22:23

ok, wie gesagt, melde dich wenn es so weit ist :)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

17

29.11.2006, 16:42

Kannst du mir noch einmal helfen. Habe da was versucht:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var1=1

for ZAHL in $( who -u | cut -c 40-41 )
do
if [ $ZAHL -ge 48 ]; then
var1=0
else
echo "Die $ZAHL ist nicht groesser als 24" > /dev/null
fi
done 

if [ $var1 = 0 ]; then
echo "
Es gibt User die schon länger als 48 Stunden auf dem 
Server angemeldet sind.

Bitte in der Konsole den Befehl who -a eingeben, um
zu sehen um welche user es sich handelt." | mail -s "ewige logins" root
fi

var1=1


Der Sinn ist eben der das nur eine Mail versendet wir wenn ein User länger als 24 Stunden eingelogt ist und nicht z.B. 20.

Leider akzeptiert er den Befehl var1=0 nicht.
Kannst du mir sagen wass ich falsch mache?

Besten Dank

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

18

29.11.2006, 17:27

starte das script mal mit
sh -x ./scriptname
dann siehst du, was die shell macht.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

Thema bewerten