Frage von Wiesbadener4711, 38

Wer kann mir bei einem Skript-Problem helfen?

Folgender One-Liner:

grep relay= /var/log/mail.log | grep 'Sep 14' | cut -f 8 -d ' ' | sort | uniq -c | sort -n

Nun möchte ich das in ein Skript verpacken um das täglich einmal per Cron aufzurufen. Dabei soll das "grep 'Sep 14' noch durch die Ausgabe von:

date -d yesterday +"%b %e"

ersetzt werden. Aber ich bekomme es nicht hin, ohne mich da in irgendwelche Probleme zu verrennen. Irgendein Shell-Kenner hier der mir da kurz unter die Arme greifen kann?

Antwort
von GWBln, 1

grep relay=  ...

m.W. wird das Gleichheitszeichen durch die Shell interpretiert, was du wohl nicht willst, es sollte also eher so lauten:

grep "relay=" ...

Das gestrige Datum würde ich so ermitteln:

Gestern=$(date -d yesterday +%d.%m.%Y)

Im Script nimmst du dann auf's Datum so Bezug

... grep $Gestern ...

im meinem Beispiel habe ich das Datum so formuliert, daß sich die bei uns übliche Form ergibt, also

17.09.2016

Anhand der Formatierungszeichen kannst du auch einen anderen Aufbau einstellen ... welche Formatierungszeichen möglich sind, bekommst du mit

man date

... sort | uniq -c ...

sollte wohl eher so lauten:

... sort --unique ...

Ich würde so vorgehen, daß du dir sukzessive die Befehle in der Shell so aufbaust, daß du das gewünschte Ergebnis bekommst ...

Variable funktionieren in der Shell genau so wie im Script:

$ Gestern=$(date -d yesterday +%d.%m.%Y)
$ echo $Gestern
17.09.2016
Antwort
von Linuxhase, 13

Hallo

grep relay= /var/log/mail.log | grep 'Sep 14' | cut -f 8 -d ' ' | sort | uniq -c | sort -n

Was soll denn damit getan werden?

Nun möchte ich das in ein Skript verpacken

So:?

#!/bin/bash
grep relay= /var/log/mail.log | grep 'Sep 14' | cut -f 8 -d ' ' | sort | uniq -c | sort

Dabei soll das "grep 'Sep 14' noch durch die Ausgabe von: date -d yesterday +"%b %e" ersetzt werden.

sed "s/'Sep 14'/$(date -d yesterday+"%b %e")/g"

Bist Du sicher das Dein Date-Befehl so funktioniert?

Linuxhase

Kommentar von Akelo ,

deswegen wollte ich ja das ganze script rauskopiert bekommen c:

Kommentar von Wiesbadener4711 ,

date -d yesterday +"%b %e" 

ruft das doch einfach mal auf - das ergibt das von mit benötigte Format. Jetzt versucht das mal in das grep mit oben reinzubekommen und in einem shell skript abrufbar zu machen. 

Kommentar von Linuxhase ,

@Akelo

deswegen wollte ich ja das ganze script rauskopiert bekommen c:

Wie meinen?

Man schreibt das Kommando (oder die Kommandos) in eine Textdatei, macht diese ausführbar und schon hat man ein Script.

ruft das doch einfach mal auf - das ergibt das von mit benötigte Format.

Bei mir:

linuxhase@arch-desktop ~ date -d yesterday +"%b %e"
date: zusätzlicher Operand „+%b %e“
„date --help“ liefert weitere Informationen.

Jetzt versucht das mal in das grep mit oben reinzubekommen und in einem shell skript abrufbar zu machen. 

So ungefähr?

#!/bin/bash
grep relay= /var/log/mail.log | cut -f 8 -d ' ' | sort | uniq -c | sort  | $(sed "s/'Sep 14'/$(date -d yesterday+"%b %e")/g"

Zeig mir doch mal einen Beispiel-Datensatz dieser mail.log und beschreibe was genau Du am Ende haben willst.

Denn es gibt ganz bestimmt Wege das hinzubekommen.

Linuxhase

Antwort
von Wiesbadener4711, 5

#!/bin/bash

GESTERN=$(date -d yesterday +"%b %e")

grep relay= /var/log/mail.log | grep "$GESTERN" | cut -f 8 -d ' ' | sort | uniq -c | sort -n

So funktioniert es jetzt auch. Danke an alle Beteiligten.

Antwort
von iwolmis, 8

ersetze  "grep 'Sep 14' "

durch

grep `date -d yesterday +"%b %e`

vlt funktionier es - ausprobieren - Zuerst aufpassen auf "`' und \

Testen mit echo XXX `date -d yesterday +"%b %e` XXX

sicherlich brauch man dort noch ein paar Sonderzeichen aber mein Comp ist fast KO muss ich morgen reinigen und neu aufsetzen. - kann ich nicht mehr testen.

Du musst den output mit Kombination vom "' \' abschirmen

Leider mein Comp geht nicht mehr - muss ich abschalten

Kommentar von iwolmis ,

Wenn ich meinen Comp wieder zum laufen bringe , dann bekommst du einen Skript von mir

Ciao

aber versuche es auch selbst :-)

Antwort
von Akelo, 27

Kannst du vielleicht mal das gesammte script posten ?

Kommentar von Wiesbadener4711 ,

Das ist das ganze Skript... wie gesagt, One-Liner. Funktioniert beim Aufruf so auch gut. Nur bekomme ich es nicht in ein Skript umgewandelt welches "Cron kompatibel" ist.. insbesondere wegen der date funktion

Kommentar von Akelo ,

Ok du musst im crontab in deinem home directory den Vollen pfad eingeben. sprich aus 

0 0 * * * deinscript.sh

wird 

0 0 * * * ~/Pfad/deinscript.sh

Falls noch kein Eintrag da ist leg einen an

Kommentar von Wiesbadener4711 ,

Ähm ja ganz so dumm bin ich ja auch nicht. Ich weiss wie das alles funktioniert. Es ist lediglich der Date Aufruf der sich so eben nicht in das Skript integrieren lässt.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten