horizontal laufender Kalender mit shellscript?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
BlackSimorgh

horizontal laufender Kalender mit shellscript?

Beitrag von BlackSimorgh » 26.12.2011 13:42:56

hi,
ich bin auf der suche nach einer Möglichkeit mit dem man einen horizontal laufenden Kalender mit Shell script erzeugen kann.
ich habe im internet diesen Code gefunden un habe versucht die Wochentage und Monate zu übersetzen, aber sobald man die Monate übersetzt steht der Kalender verkehrtherum da.
mit verkehrt herum ist gemeint, dass die tage anstatt von 1 bis 31 von 31 zu 1 laufen.

Code: Alles auswählen

echo
echo `cal` | 
sed -E '1,$'"s/ ($(date +%e))( |$)/ $(echo '\033[1;31m')\1$(echo  '\033[0m')\2/" | 
sed s'/So Mo Di Mi Do Fr Sa//g' | 
sed s'/  */  \|  /g' | 
sed s'/^  \|//' | sed s'/  \|//' | sed s'/\|/  /' | 
sed s'/\|/./g' | sed s"/$/       $(date +%A)/" |

sed -e 's/Januar/ژانویه/g' -e 's/Februar/فوریه/g' -e 's/März/مارس/g' -e 's/April/آوریل/g' -e 's/Mai/مه/g' -e 's/Juni/ژوئن/g' -e 's/Juli/ژوئیه/g' -e 's/August/اوت/g' -e 's/September/سپتامبر/g' -e 's/Oktober/اکتبر/g' -e 's/November/نوامبر/g' -e 's/Dezember/دسامبر/g' -e 's/Montag/دوشنبه/g' -e 's/Dienstag/سه شنبه/g' -e 's/Mittwoch/چهارشنبه/g' -e 's/Donnerstag/پنجشنبه/g' -e 's/Freitag/جمعه/g' -e 's/Samstag/شنبه/g' -e 's/Sonntag/یکشنبه/g' -e 's/2011//g'
weiß jemand was man da machen kann, dass es funktioniert?
ich wäre auch damit einverstanden nur die Tage anzuzeigen, so lange der "heutige Tag" markiert bleibt.

danke im voraus

Benutzeravatar
whisper
Beiträge: 3379
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: horizontal laufender Kalender mit shellscript?

Beitrag von whisper » 02.01.2012 12:23:10

Ich verstehe zwar nicht den Sinn des Ganzen, aber funktioniert der Teil

Code: Alles auswählen

#!/bin/bash
echo
echo `cal` |
sed -E '1,$'"s/ ($(date +%e))( |$)/ $(echo '\033[1;31m')\1$(echo  '\033[0m')\2/" |\
sed s'/So Mo Di Mi Do Fr Sa//g' |\
sed s'/  */  \|  /g' |\
sed s'/^  \|//' | sed s'/  \|//' | sed s'/\|/  /' 
soweit so, wie du dir das vorstellst?
Und schreib doch mal wie das Ergebenis aussehen soll
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: horizontal laufender Kalender mit shellscript?

Beitrag von rendegast » 02.01.2012 12:53:02

Rein formal

Code: Alles auswählen

 ...
sed s'/  */  \|  /g' |
sed s'/^  \|//' | sed s'/  \|//' | sed s'/\|/  /' |
sed s'/\|/./g' | sed s"/$/       $(date +%A)/" |

sed -e 's/Januar/ژانویه/g' -e 's/Februar/فوریه/g' -e 's/März/مارس/g' -e 's/April/آوریل/g' -e 's/Mai/مه/g' -e 's/Juni/ژوئن/g' -e 's/Juli/ژوئیه/g' -e 's/August/اوت/g' -e 's/September/سپتامبر/g' -e 's/Oktober/اکتبر/g' -e 's/November/نوامبر/g' -e 's/Dezember/دسامبر/g' -e 's/Montag/دوشنبه/g' -e 's/Dienstag/سه شنبه/g' -e 's/Mittwoch/چهارشنبه/g' -e 's/Donnerstag/پنجشنبه/g' -e 's/Freitag/جمعه/g' -e 's/Samstag/شنبه/g' -e 's/Sonntag/یکشنبه/g' -e 's/2011//g'
eher zu sowas:

Code: Alles auswählen

sed "
    s/So Mo Di Mi Do Fr Sa//g
    s/  */  \|  /g
    s/^  \|//
    s/  \|//
    s/\|/  /
    s/\|/./g
    s/$/       $(date +%A)/
    s/Januar/ژانویه/g
    s/Februar/فوریه/g
    s/März/مارس/g
    s/April/آوریل/g
    s/Mai/مه/g
    s/Juni/ژوئن/g
    s/Juli/ژوئیه/g
    s/August/اوت/g
    s/September/سپتامبر/g
    s/Oktober/اکتبر/g
    s/November/نوامبر/g
    s/Dezember/دسامبر/g
    s/Montag/دوشنبه/g
    s/Dienstag/سه شنبه/g
    s/Mittwoch/چهارشنبه/g
    s/Donnerstag/پنجشنبه/g
    s/Freitag/جمعه/g
    s/Samstag/شنبه/g
    s/Sonntag/یکشنبه/g
    s/2011//g
    "
?
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

BlackSimorgh

Re: horizontal laufender Kalender mit shellscript?

Beitrag von BlackSimorgh » 02.01.2012 15:21:27

also, es hat bei beiden nicht so funktioniert wie ich es wollte. und jetzt habe ich noch das Problem, dass der heutige Tag nicht mehr markiert wird und das schon bei dem ursprung-code, also liegt es nicht an euren Codes. und deswegen habe ich dann den code hier gefunden:

Code: Alles auswählen

#!/usr/bin/env ruby
#
# Author: Robert Jorgenson
# Author email: rjorgenson@gmail.com
require 'Date'
ABBR_DAYNAMES = {0, 'Su', 1, 'Mo', 2, 'Tu', 3, 'We', 4, 'Th', 5, 'Fr', 6, 'Sa'}

def days_in_month(year, month)
  return (Date.new(year, 12, 31) << (12 - month)).day
end

def day_in_month(year, month, day)
  return Date.new(year, month, day).wday
end

def build_day_array(year, month)
  day_array = Array.new
  for d in (1..days_in_month(year, month))
    day_array[d] = ABBR_DAYNAMES[day_in_month(year, month, d)]
  end
  day_array.shift
  return day_array * "   "
end

def build_separator(year, month)
  #color = "\e[32m" #green
  color = "\e[31m" #uncomment for red
  separator_string = "==" # change this to change separator, best if 2 characters wide
  close = "\e[0m" # don't change this
  separator = Array.new
  for d in (1..days_in_month(year, month))
    if year == Time.now.year && month == Time.now.month && d == Time.now.day then
      separator[d] = "#{color}#{separator_string}#{close}"
    else
      separator[d] = "#{separator_string}"
    end
  end
  separator.shift
  return separator * "   "
end

def build_date_array(year, month)
  date_array = Array.new
  for d in (1..days_in_month(year, month))
    date_array[d] = d
  end
  date_array.shift
  date_array.each do |d|
    if d < 10 then
      date_array[(d-1)] = "0#{d}"
    end
  end
  return date_array * "   "
end

year = Time.now.year
month = Time.now.month

puts build_day_array(year, month)
puts build_separator(year, month)
puts build_date_array(year, month)
aber es wäre besser wenn das so aussehen würde wie das erste. also dass da zwischen den tagen punkte wären und dass der heutige tag farbig markiert wird.

und ich erkläre nochmal wozu ich das ganze brauche:
ich bin ein mac user und verwende ein Programm der mit Hilfe von Shellscripten usw. Informationen auf dem Schreibtisch anzeigen kann. und weil ich in den mac Foren keine Hilfe gefunden habe dachte ich probiere ich es halt hier.

BlackSimorgh

Re: horizontal laufender Kalender mit shellscript?

Beitrag von BlackSimorgh » 09.01.2012 14:46:10

hallo Leute,
ich habe diesen Code im Internet entdeckt und habe es zu meinen "Bedürfnissen" verändert:
hier das original:

Code: Alles auswählen

#!/bin/bash
declare color="${1:-36}" d=0 yy mm dd mon day wkd dow
declare months=( 31 28 31 30 31 30 31 31 30 31 30 31 ) wkdays=( "Su" "Mo" "Tu" "We" "Th" "Fr" "Sa" )
read yy mm dd mon < <(date "+%Y %m %d %b")
[ $(( yy % 4 )) -eq 0 ] && ${months[1]}=29
wkd=$(date -jnu ${mm}010101${yy} '+%w')
mm=${months[$mm-1]}
declare line1="          " line2="\e[1;37m$mon $yy\e[0m  "
while [ $(( ++d )) -le $mm ]; do
  printf -v day "%02d" $d
  (( dow = ( d + wkd - 1 ) % 7 ))
  [ $dow -eq 0 -a $d -gt 1 ] && { line1="$line1  |"; line2="$line2  |"; }
  [ "$day" == "$dd" ] && { line1="$line1\e[1;${color}m"; line2="$line2\e[1;${color}m"; }
  line1="$line1  ${wkdays[$dow]}"; line2="$line2  $day"
  [ "$day" == "$dd" ] && { line1="$line1\e[0m"; line2="$line2\e[0m"; }
done
printf "$line1\n$line2\n"
und hier das veränderte:

Code: Alles auswählen

#!/bin/bash
declare color="${1:-31}" d=0
declare months=( 31 28 31 30 31 30 31 31 30 31 30 31 )
read mm dd < <(date "+%m %d")
[ $(( yy % 4 )) -eq 0 ] && ${months[1]}=29
wkd=$(date -jnu ${mm} '+%w')
mm=${months[$mm-1]}
declare line2="\e[1;37m$mon\e[0m"
while [ $(( ++d )) -le $mm ]; do
  printf -v day "%02d" $d
  (( dow = ( d + wkd - 1 ) % 7 ))
  [ "$day" == "$dd" ] && { line2="$line2\e[1;${color}m"; }
  line2="$line2$day"
  [ "$day" == "$dd" ] && { line2="$line2\e[0m"; }
  line2="$line2  .  "
done
printf "\n$line2\n"
wie ihr vielleicht schon bemerkt habt habe ich einige Zeilen entfernt und das hier

Code: Alles auswählen

  line2="$line2  .  "
eingesetzt um einen seperator in form eines Punktes zu haben. mein Problem ist jetzt aber, dass er mir am letzten tag des Monats auch noch einen Punkt hin macht. also da wo eigentlich kein Punkt sein darf.
weiß jemand wie man das verhindern kann?

danke im voraus

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: horizontal laufender Kalender mit shellscript?

Beitrag von rendegast » 10.01.2012 04:11:45

... und das hier

Code: Alles auswählen

line2="$line2  .  "
eingesetzt um einen seperator in form eines Punktes zu haben. mein Problem ist jetzt aber, dass er mir am letzten tag des Monats auch noch einen Punkt hin macht. also da wo eigentlich kein Punkt sein darf.
In Deinem ersten (sh-)Skript hattest Du dafür

Code: Alles auswählen

sed s'/\|/./g'
versucht, was besser funktioniert mit

Code: Alles auswählen

sed s'/[|]/./g'
Also in der Vorlage zu Deinem 3ten (bash-)Skript einfach an das letzte 'printf' angehängt.



Das bash-Skript mit nur 'date' als externer Funktion ist ja fein.
Ich bekomme einen Fehler wegen 'date -j',
verwendete der Autor eine anderes 'date'?
Noch eine kleine Korrektur:

Code: Alles auswählen

[ $(( yy % 4 )) -eq 0 ] && ${months[1]}=29
->

Code: Alles auswählen

[ $(( yy % 4 )) -eq 0 ] && months[1]=29
EDIT, und für das debian/linux-date:

Code: Alles auswählen

    wkd=$(date -jnu ${mm}010101${yy} '+%w')
->

Code: Alles auswählen

    wkd=$(date -d ${yy}-${mm}-01 '+%w')


----------------------------------------------
Ich hätte noch einen:

Code: Alles auswählen

#!/bin/sh

CAL() { cal ; }
CAL() { cal feb 2012 ; }

MoYe() { CAL | head -n 1 ; }
DATA() { CAL | head -n -1 | tail -n +2 | sed 's@^@ | @' ; }

TMPDIR=$(mktemp -d)
DATA | sed '2q'		> $TMPDIR/CONSTRUCT1
DATA | sed '3q;2c\'	> $TMPDIR/CONSTRUCT2
DATA | sed '4q;2,3c\'	> $TMPDIR/CONSTRUCT3
DATA | sed '5q;2,4c\'	> $TMPDIR/CONSTRUCT4
DATA | sed '6q;2,5c\'	> $TMPDIR/CONSTRUCT5
DATA | sed '7q;2,6c\'	> $TMPDIR/CONSTRUCT6
# cal gibt 4-6 Zeilen für die Tage, dieses loescht die ueberzaehligen CONSTRUCT
find $TMPDIR -size -26c -delete
paste $TMPDIR/CONSTRUCT* | \
    sed -E '1,$'"s/ ($(date +%e))( |$)/ $(echo '\033[1;31m')\1$(echo  '\033[0m')\2/"

rm -rf $TMPDIR
holprig
Zuletzt geändert von rendegast am 11.01.2012 16:20:59, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

BlackSimorgh

Re: horizontal laufender Kalender mit shellscript?

Beitrag von BlackSimorgh » 10.01.2012 12:14:54

hey, danke aber mit keinen von den Codes hat es funktioniert.
und bei dem letzten zeigte mir gar nix an.

noch andere Vorschläge?

BlackSimorgh

Re: horizontal laufender Kalender mit shellscript?

Beitrag von BlackSimorgh » 11.01.2012 02:55:14

also, ich bin mit mein Latein am Ende.
ich habe alle möglichen Variationen ausprobiert. ohne erfolg.

@rendegast meintest du das mit den Codes so:

Code: Alles auswählen

#!/bin/bash
declare color="${1:-31}" d=0
declare months=( 31 28 31 30 31 30 31 31 30 31 30 31 )
read mm dd < <(date "+%m %d")
[ $(( yy % 4 )) -eq 0 ] && months[1]=29
wkd=$(date -jnu ${mm} '+%w')
mm=${months[$mm-1]}
declare line2="\e[1;37m$mon\e[0m"
while [ $(( ++d )) -le $mm ]; do
  printf -v day "%02d" $d
  (( dow = ( d + wkd - 1 ) % 7 ))
  [ "$day" == "$dd" ] && { line2="$line2\e[1;${color}m"; }
  line2="$line2$day"
  [ "$day" == "$dd" ] && { line2="$line2\e[0m"; }
  line2="$line2  .  "
done
printf "\n$line2\n" sed s'/[|]/./g'
wenn ja, hat das überhaupt nichts gebracht.

Ps. bei dem letzten Code von dir wurde überhaupt nix ausgegeben und warum hast du da Februar 2012 drin stehen?

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: horizontal laufender Kalender mit shellscript?

Beitrag von rendegast » 11.01.2012 03:52:36

Code: Alles auswählen

printf "\n$line2\n" sed s'/[|]/./g'
Schöner Anfang.
Wo ist das Pipe, welches hier bisher reichlich verwendet wurde?

Code: Alles auswählen

printf "\n$line2\n"   |   sed s'/[|]/./g'
Ps. bei dem letzten Code von dir wurde überhaupt nix ausgegeben
Was hast Du da kaputt gemacht?
Debiancoreutils Debianfindutils sind installiert? Ausführbar?
und warum hast du da Februar 2012 drin stehen?
Spaß an der Freude? Du werkelst hier mit 3 Skripten herum und siehst nicht, daß das ein Testeintrag ist?

Code: Alles auswählen

$ chmod 755 test 
$ ./test 
 | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do 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

$ mcedit test                 (eine kleine Aenderung)
$ ./test 
 | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do Fr Sa  | So Mo Di Mi Do 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
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

BlackSimorgh

Re: horizontal laufender Kalender mit shellscript?

Beitrag von BlackSimorgh » 11.01.2012 04:04:58

rendegast hat geschrieben:

Code: Alles auswählen

printf "\n$line2\n" sed s'/[|]/./g'
Schöner Anfang.
Wo ist das Pipe, welches hier bisher reichlich verwendet wurde?

Code: Alles auswählen

printf "\n$line2\n"   |   sed s'/[|]/./g'
also, das hat irgendwie auch nix gebracht.
Ps. bei dem letzten Code von dir wurde überhaupt nix ausgegeben
Ich keine Idee, was Du da kaputt gemacht hast.
Debiancoreutils Debianfindutils sind installiert? Ausführbar?
also, wie schon gesagt bin ich Mac user und benutze ein Programm namens Geektool, welches die scripte dazu benutzt um Informationen auf dem Schreibtisch anzuzeigen.

jetzt sieht mein code so aus aber gibt trotzdem nicht das aus was er soll.

Code: Alles auswählen

#!/bin/bash
declare color="${1:-31}" d=0
declare months=( 31 28 31 30 31 30 31 31 30 31 30 31 )
read mm dd < <(date "+%m %d")
[ $(( yy % 4 )) -eq 0 ] && months[1]=29
wkd=$(date -jnu ${mm} '+%w')
mm=${months[$mm-1]}
declare line2="\e[1;37m$mon\e[0m"
while [ $(( ++d )) -le $mm ]; do
  printf -v day "%02d" $d
  (( dow = ( d + wkd - 1 ) % 7 ))
  [ "$day" == "$dd" ] && { line2="$line2\e[1;${color}m"; }
  line2="$line2$day"
  [ "$day" == "$dd" ] && { line2="$line2\e[0m"; }
  line2="$line2  .  "
done
printf "\n$line2\n" | sed s'/[|]/./g'
funktioniert das den bei dir, wenn du es ausführst?

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: horizontal laufender Kalender mit shellscript?

Beitrag von rendegast » 11.01.2012 04:33:26

Die Skripte solltest Du erstmal auf einer Konsole ausführen.
Es werden Dir dann zumindest Fehlermeldungen ausgegeben,
zBsp sowas wie "head: Programm nicht gefunden" oder "Fehler in Zeile 12" o.ä.
Wenn das Skript grundsätzlich läuft, folgen Sachen wie Ausgabeverfeinerung und Stabilisierung.
Dann die eventuellen Filter von geektool darauf anpassen.



Code: Alles auswählen

...
  line2="$line2  .  "
done
printf "\n$line2\n" | sed s'/[|]/./g'
funktioniert das den bei dir, wenn du es ausführst?
->
rendegast hat geschrieben: Also in der Vorlage zu Deinem 3ten (bash-)Skript einfach an das letzte 'printf' angehängt.
Bei Deinem Code steht ja dieses line2="$line2 . ", was die Punkte schon gemacht hat.
Bei der Vorlage angehängt ergibt sich:

Code: Alles auswählen

$ ./VorlageohnePipeSed
date: invalid option -- 'j'
„date --help“ gibt weitere Informationen.
            Su  Mo  Tu  We  Th  Fr  Sa  |  Su  Mo  Tu  We  Th  Fr  Sa  |  Su  Mo  Tu  We  Th  Fr  Sa  |  Su  Mo  ..........
Jan 2012    01  02  03  04  05  06  07  |  08  09  10  11  12  13  14  |  15  16  17  18  19  20  21  |  22  23  ..........

$ ./VorlagemitPipeSed
date: invalid option -- 'j'
„date --help“ gibt weitere Informationen.
            Su  Mo  Tu  We  Th  Fr  Sa  .  Su  Mo  Tu  We  Th  Fr  Sa  .  Su  Mo  Tu  We  Th  ...........
Jan 2012    01  02  03  04  05  06  07  .  08  09  10  11  12  13  14  .  15  16  17  18  19  ............
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

BlackSimorgh

Re: horizontal laufender Kalender mit shellscript?

Beitrag von BlackSimorgh » 11.01.2012 12:33:23

aha, dann verarbeitet der Mac das anders.
also bei mir wird da, egal ob ich den code in geektool oder im Terminal eingebe, das gleiche angezeigt, nämlich das hier:

Code: Alles auswählen

01  .  02  .  03  .  04  .  05  .  06  .  07  .  08  .  09  .  10  .  11  .  12  .  13  .  14  .  15  .  16  .  17  .  18  .  19  .  20  .  21  .  22  .  23  .  24  .  25  .  26  .  27  .  28  .  29  .  30  .  31  .
wobei der heutige Tag rot markiert ist.

Antworten