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

[SOLVED] Alle Arbeitstage von Montag bis Freitag

Hallo Forum!

Ich habe folgendes Problem.
Ich will über den Kalender von Unix ( cal ) mir alle Tage von Montag bis Freitag ausgeben lassen.

Code:
cal 3 2011

Das Ergebnis würde ich mit awk weiterbearbeiten, würde dann wie folgt aussehen:

Code:
cal 3 2011 | awk '{ print $1, $2, $3, $4, $5 }'

Jetzt besteht aber das Problem, das die Ausgabe von awk sagt, dass der 5te März ein Arbeitstag wäre, stimmt aber leider nicht so.
Dadurch, dass die cal Ausgabe Leerzeichen bei Sonntag und Montag hat, ist für awk damit die 1ste Spalte leider der Dienstag und somit der letzte Arbeitstag der 5te, welcher aber ein Samstag wäre.

Ich finde leider keinen Weg, wie ich es umgehen kann, dass die 1ste Spalte noch immer der Montag ist und nicht wie es awk falsch sieht!

Kann mir jemand vll helfen?

Danke Euch vielmals schon im vorhinein!
 
A

Anonymous

Gast
Ist ein bischen kompliziert da die Ausgabe von cal nicht gerade für solche Spielchen optimal ist.
Wenn du Montag bis Freitag über awk willst versuch mal das hier (ist eine Zeile, auch wenn eventuell bei dir 2 angezeigt werden) Und bitte copy&paste, nicht abschreiben, das sind zu viele Sonderzeichen.
Code:
cal 3 2011 | sed -e '3,$s/^\(.*\)$/\1 /' -e '3,$s/\([ 0-9]\{2\}\)[[:space:]]/\1,/g '|awk -F"," 'NR>2{print $2,$3,$4,$5,$6}'

Übrigens Profis machen das mit "cut" und nicht mit awk
Code:
cal 3 2011 | cut -c4-17
man muss nicht immer die kompliziertesten Befehle verwenden wenn es einfache dafür gibt.

Aber die Feiertage rechne ich dir nicht auch noch mit sed und awk raus ;) Das meiste ist Osterabhängig und Ostersonntag ist etwas kompliziert zu errechnen.

robi
 

framp

Moderator
Teammitglied
Oder ganz mit awk:
Code:
cal 3 2011 | awk '{ if (NR==1) next; for (i=4; i<18; i+=3) printf "%s ",substr($0,i,2); printf "\n"; }'
robi schrieb:
cal 3 2011 | cat -c4-17
Kleiner Typo: Sollte cut heissen ;)
 
Aber das Resultat ist's glaub noch nicht ganz:
Code:
admine@reni2:~> cal 3 2011 | cut -c4-17 
   März 2011  
Di Mi Do Fr Sa
 1  2  3  4  5
 8  9 10 11 12
15 16 17 18 19
22 23 24 25 26
29 30 31

admine@reni2:~> cal 3 2011 | awk '{ if (NR==1) next; for (i=4; i<18; i+=3) printf "%s ",substr($0,i,2); printf "\n"; }'
Di Mi Do Fr Sa 
 1  2  3  4  5 
 8  9 10 11 12 
15 16 17 18 19 
22 23 24 25 26 
29 30 31

Evt. das aber:
Code:
cal 3 2011 | cut -c1-15
     März 2011
Mo Di Mi Do Fr 
    1  2  3  4 
 7  8  9 10 11 
14 15 16 17 18 
21 22 23 24 25 
28 29 30 31
 

framp

Moderator
Teammitglied
Meins sieht so aus:
Code:
framp@majestix ~ $ cal 3 2011 | cut -c4-17 
  March 2011
Mo Tu We Th Fr
    1  2  3  4
 7  8  9 10 11
14 15 16 17 18
21 22 23 24 25
28 29 30 31

framp@majestix ~ $ cal 3 2011 | awk '{ if (NR==1) next; for (i=4; i<18; i+=3) printf "%s ",substr($0,i,2); printf "\n"; }'
Mo Tu We Th Fr 
    1  2  3  4 
 7  8  9 10 11 
14 15 16 17 18 
21 22 23 24 25 
28 29 30 31
Mein System läuft in English - da fängt die Woche mit So an :D. Da Deines in Deutsch läuft fängt die Woche mit Mo an. Du musst also die Offsets entsprechend anpassen :roll:
 
Und warum gibts dann Unterschiede zwischen meiner und deiner Ausgabe?
Code:
cal 3 2011 
      März 2011     
Mo Di Mi Do Fr Sa So
    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

cal 3 2011 | cut -c4-17 
   März 2011  
Di Mi Do Fr Sa
 1  2  3  4  5
 8  9 10 11 12
15 16 17 18 19
22 23 24 25 26
29 30 31

cal 3 2011 | cut -c1-15
      März 2011
Mo Di Mi Do Fr 
    1  2  3  4 
 7  8  9 10 11 
14 15 16 17 18 
21 22 23 24 25 
28 29 30 31
Code:
admine@reni2:~> locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
 

framp

Moderator
Teammitglied
Code:
framp@majestix ~ $ cal 3 2011
     March 2011
Su Mo Tu We Th Fr Sa
       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

framp@majestix ~ $ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
 
A

Anonymous

Gast
framp schrieb:
Ganz einfach - Robi und ich haben die englishe locale, er die deutsche - und in USA fängt die Woche mit So - in Deutschland mit Mo ;)
Fast richtig, Framp und ich arbeiten immer nur unter root, wir haben gar keinen normalen User angelegt, das verraten wir aber nicht, wir predigen das nur immer hier im Forum den Neulingen vor damit diese ja nicht unnötig unter root arbeiten. ;) ;) ;)

Notfalls in Scripten die LANG und wenn dort noch Zeitangaben irgendwelcher Befehle verarbeitet werden immer die LC_ALL fest setzen oder den Befehlen voransetzen.
Code:
LC_ALL=POSIX cal 3 2011
sollte zB bei einem normalem User und auch bei root von China bis New York immer schön bei Sonntag anfangen.

robi
 
Hi!

Danke euch vielmals!

Habe auch nach vielen erfolglosen Versuchen ein Ergebnis zustande gebracht!

Code:
cal 3 2011 | tail +3 | sed -e 's;^.. ;;' -e 's;^\(...............\).*$;\1;'

Ist zwar nicht so elegant finde ich, aber der Zweck heiligt die Mittel!

ad robi: Nein, danke, die Osterfeiertage und co musst du mir nicht noch ausrechnen, die habe ich selber schon berechnet, bzw in diesem Fall benötige ich sie auch gar nicht.
Ich brauchte unbedingt nur die Arbeitstage einer Woche, egal ob an einem Tag ein Feiertag ist!

Danke Euch Allen vielmals!
 

framp

Moderator
Teammitglied
robi schrieb:
framp schrieb:
Ganz einfach - Robi und ich haben die englishe locale, er die deutsche - und in USA fängt die Woche mit So - in Deutschland mit Mo ;)
Fast richtig, Framp und ich arbeiten immer nur unter root, wir haben gar keinen normalen User angelegt, das verraten wir aber nicht, wir predigen das nur immer hier im Forum den Neulingen vor damit diese ja nicht unnötig unter root arbeiten. ;) ;) ;)
Fast richtig. :roll: Ich arbeite zwar schon öfter als root - aber in diesen Fällen nicht. Ich habe mein System wirklich mit en_us aufgesetzt. Die deutschen Meldungen verstehe ich einfach meistens nicht :(
 
Oben