Shell-Script: Welcher Tag ist der 6. Arbeitstag im Monat?

Letztens wollte ich in einem Shell-Script bestimmen ob der n-te Tag eines Monats ein Arbeitstag (Montag bis Freitag) ist…

Log geht’s mit “cal”:

$ cal -m
     April 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

Die ersten beiden Zeilen müssen weg! Hier hilft uns awk weiter. Alle Records (sprich Zeilen) >2 ausgeben:

$ cal -m | awk 'NR>2'
             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

Dann die beiden rechten Spalten, also die Samstage und Sonntage abschneiden. Auch ein job für awk. Nur die ersten 14 Zeichen…

$ cal -m | awk 'NR>2' | awk '{print substr($0,0,14)}'
             1
 4  5  6  7  8
11 12 13 14 15
18 19 20 21 22
25 26 27 28 29

Und jetzt zusammen:

$ cal -m | awk 'NR>2 {print substr($0,0,14)}'
             1
 4  5  6  7  8
11 12 13 14 15
18 19 20 21 22
25 26 27 28 29

Jetzt sind schon mal nur alle Arbeitstage (Mon – Fr) übrig. – Wär’ noch schick das alles in einer Zeile zu haben. Also weg mit den Zeilenumbrüchen. Ein Job für tr (=translate):

$ cal -m | awk 'NR>2' | awk '{print substr($0,0,14)}' | tr "\n" " "
             1  4  5  6  7  8 11 12 13 14 15 18 19 20 21 22 25 26 27 28 29

Jetzt müssen wir nur noch die n-te (also z.B. 6.) Spalte ausgeben. Noch ein job für awk:

$ cal -m | awk 'NR>2' | awk '{print substr($0,0,14)}' | tr "\n" " " | awk '{printf $6}'
8

Also ist der 6. Arbeitstag im April 2011 der 8.4.2011. – Stimmt’s?! 😉