• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] crontab(s) in csv exportieren

Gimpel

Guru
Hallöle,

ich brauch mal einen Tatscher auf den Hinterkopf.. :irre:

Problem: Sämtliche cronjobs aller user auf unseren produktiven Webservern und Datenbanken sollen in ein zentrales System migriert werden, welches dann die Steuerung der Jobs übernimmt.
Dazu müssen alle cronjobs als CSV vorgelegt werden.

Lösungsansatz: Awk, dachte ich mir
Code:
cat phdb2/wlrun|awk '!/^#/ { for (i=1;i<=5;i++) { printf $i";" } printf "\n" }'
liefert schonmal die Zeiten gesplittet, ala
Code:
59;01;*;*;*;
02;02;*;*;*;
30;3;*;*;*;
usw.

So, nun das eigentliche Problem: wie bekomme ich ich den Rest der jeweiligen Zeile hinten dran? Ein $6 $7 etc langt nicht, da teilweise scripte mit irrwitzig vielen Parametern aufgerufen werden, zB eine Liste mit Email-Adressen, sprich da muss einfach alles i>5 hinten dran.
Code:
awk '!/^#/ { for (i=1;i<=5;i++) { printf $i";" } { for (r=1;r>5;r++) { printf $r" " } } printf "\n" }'
..funktioniert so nicht.

Hint?
 
OP
Gimpel

Gimpel

Guru
LOL, ok, das geht:
Code:
awk '!/^#/ { for (i=1;i<=5;i++) { printf $i";" } { $1="";$2="";$3="";$4="";$5=""; print } }'|sed 's:     ::g'

Aber das geht sicher auch hübscher, irgendwie.
 

regexer

Advanced Hacker
Wie wär's mit bash ;)

Code:
crontab -l | grep -v '^#' | while read a b c d e f
do
   printf "%s;%s;%s;%s;%s;%s\n" $a $b $c $d $e "$f"
done
... ungetestet
 
Code:
crontab -l | awk '!/^#/ { $1=$1";" ; $2=$2 ";" ; $3=$3 ";" ; $4=$4 ";" ; $5=$5";" ; print }'
Das wäre mein Vorschlag.
Haveaniceday

Edit: Falle: in meinen Crontabs kommen ";" vor: ( export LANG=C; befehl1 ; befehl2)
Damit wäre das csv-Format für mich mit ";" unbrauchbar....
 

regexer

Advanced Hacker
haveaniceday schrieb:
Edit: Falle: in meinen Crontabs kommen ";" vor: ( export LANG=C; befehl1 ; befehl2)
Damit wäre das csv-Format für mich mit ";" unbrauchbar....
Stimmt! Allerdings verwende ich bei mehreren Befehlen in der crontab meist &&. Das passt meist besser - zumindest in meinem Fällen...
 
OP
Gimpel

Gimpel

Guru
Danke euch zwei.

Die BASH-Methode führt defacto nur einen "cat" aus, die AWK-Methode funktioniert soweit, außer dass Leerzeichen mit drin sind: "; "
Aber das sieht jedenfalls hübscher aus ;)

Line seperator sind kein Problem, ich/wir verwende/n grundsätzlich &&, bzw scripten das zwecks Fehler-Handling/Logging.
 

regexer

Advanced Hacker
Gimpel schrieb:
Die BASH-Methode führt defacto nur einen "cat" aus
Eigentlich nicht. Der Trick ist der, dass der read automatisch die ersten fünf Spalten in $a bis $e einliest - analog zum AWK. Ab der 6. Spalte (also der Rest) landet alles in $f, inklusive Leerzeichen und allem drum und dran. Man Muss also nur noch Strichpunkte dazwischen setzen. Das habe ich mit printf gelöst - man kann es natürlich auch mit echo machen.

Code:
prompt> echo "1 2 3 4 5 6 7   8" | while read a b c d e f; do printf "%s;%s;%s;%s;%s;%s\n" $a $b $c $d $e "$f"; done
1;2;3;4;5;6 7   8
EDIT: ich merke gerade dass ich oben ein $d vergessen habe, ich trage es nach... :eek:ps:
 
haveaniceday schrieb:
Code:
crontab -l | awk '!/^#/ { $1=$1";" ; $2=$2 ";" ; $3=$3 ";" ; $4=$4 ";" ; $5=$5";" ; print }'
Edit: Falle: in meinen Crontabs kommen ";" vor: ( export LANG=C; befehl1 ; befehl2)
Damit wäre das csv-Format für mich mit ";" unbrauchbar....
Abgesehen davon dass es nicht brauchbar ist, kommt dennoch Perl kürzer weg:
Code:
perl -lne 'print join";",split/\s+/,$_,6 if!/^#/' </etc/crontab
(bzw crontab -l gepipet und mit 5 bei privaten Crontabs)
 

regexer

Advanced Hacker
jengelh schrieb:
Abgesehen davon dass es nicht brauchbar ist, kommt dennoch Perl kürzer weg:
Code:
perl -lne 'print join";",split/\s+/,$_,6 if!/^#/' </etc/crontab
Um das awk-script voll abzubilden fehlt noch etwas: s/^\s+//
SCNR ;)
 
Oben