[OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Christian Schmidt
Hallo Liste,

gerade tueftele ich an einem Wrapper fuer vacation herum, der ein
~/.forward-File in folgendem Format erzeugen soll:
benutzername, | vacation -A alias benutzername

Der Alias stellt dabei das Konstrukt Vorname.Nachname dar; die Aliasse
aller Benutzer liegen in _einer_ Datei:
Vorname.Nachname: benutzername
Also beispielsweise:
Christian.Schmidt: schmidtc

Was mir vorschwebt, ist folgendes:
- Ich suche nach dem Benutzernamen in der aliases-Datei.
- Beim entsprechenden Match extrahiere ich die erste Spalte, entferne
  den Doppelpunkt, haenge -A vornedran und echoe das Ergebnis
  zusammen mit dem Rest in die .forward-Datei.

Was ich bisher habe, ist folgendes:

awk '($2==schmidtc) {print $1}' ${ALIASFILE}
liefert mir Christian.Schmidt: zurueck.

awk '($2==schmidtc) {print $1}' ${ALIASFILE} | sed -e 's/\://'
liefert mir Christian.Schmidt zurueck.
Irgendwie kann ich das Entfernen des abschliessenden Doppelpunkts doch
sicher auch von awk erledigen lassen, oder?

Wenn ich das bisher erwaehnte in einem Shellskript formuliere:

#!/bin/bash
  #
  ALIASFILE=aliases.ls
  USERNAME=${1}
  #
  awk '($2==${USERNAME}) {print $1}' ${ALIASFILE} | sed -e 's/\://'

...dann passiert nichts - ich bekomme keine Ausgabe.
Beissen sich die Variablendeklarationen mit den intern
von awk verwendeten?
Kann mir jemand einen Stoss in die richtige Richtung verpassen?
Manual Pages und Googeln haben mir nicht wirklich weitergeholfen...

Gruss, Danke  sorry fuer OT,
Christian
-- 
Frauen schulden keiner einzigen Religion Dank für auch nur einen
Impuls der Freiheit.
-- Susan Brownell Anthony


signature.asc
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Frank Dietrich
Hallo Christian,

Christian Schmidt
[EMAIL PROTECTED] wrote:

 gerade tueftele ich an einem Wrapper fuer vacation herum, der ein
 ~/.forward-File in folgendem Format erzeugen soll:
 benutzername, | vacation -A alias benutzername
 
 Was mir vorschwebt, ist folgendes:
 - Ich suche nach dem Benutzernamen in der aliases-Datei.
 - Beim entsprechenden Match extrahiere ich die erste Spalte,
 entferne
   den Doppelpunkt, haenge -A vornedran und echoe das Ergebnis
   zusammen mit dem Rest in die .forward-Datei.

Vielleicht als Lösungsansatz 

echo Christian.Schmidt: schmidtc | sed -n \
's/^\(.*\)\.\(.*\):\(.*schmidtc.*\)/-A \1.\2/p'

Mit awk geht sicher auch, aber damit kenn ich mich nicht sonderlich
gut aus.

Frank



Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Michelle Konzack
Hallo Christian, 

Am 2004-09-22 14:01:42, schrieb Christian Schmidt:
 Hallo Liste,
 
 gerade tueftele ich an einem Wrapper fuer vacation herum, der ein
 ~/.forward-File in folgendem Format erzeugen soll:
 benutzername, | vacation -A alias benutzername
 
 Der Alias stellt dabei das Konstrukt Vorname.Nachname dar; die Aliasse
 aller Benutzer liegen in _einer_ Datei:
 Vorname.Nachname: benutzername
 Also beispielsweise:
 Christian.Schmidt: schmidtc

also ich würde das umgedreht schreiben also

schmidtc:Christian.Schmidt

und dann:

 Was mir vorschwebt, ist folgendes:
 - Ich suche nach dem Benutzernamen in der aliases-Datei.
 - Beim entsprechenden Match extrahiere ich die erste Spalte, entferne
   den Doppelpunkt, haenge -A vornedran und echoe das Ergebnis
   zusammen mit dem Rest in die .forward-Datei.

ALIASFILE=aliases.ls
grep $1 $ALIASFILE |sed -e s/^$1\://


 #!/bin/bash
   #
   ALIASFILE=aliases.ls
   USERNAME=${1}
   #
   awk '($2==${USERNAME}) {print $1}' ${ALIASFILE} | sed -e 's/\://'
 
 ...dann passiert nichts - ich bekomme keine Ausgabe.

 Gruss, Danke  sorry fuer OT,
 Christian

Greetings
Michelle

-- 
Linux-User #280138 with the Linux Counter, http://counter.li.org/ 
Michelle Konzack   Apt. 917  ICQ #328449886
   50, rue de Soultz MSM LinuxMichi
0033/3/8845235667100 Strasbourg/France   IRC #Debian (irc.icq.com)


signature.pgp
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Juergen Salk
Christian Schmidt [EMAIL PROTECTED] wrote:

 #!/bin/bash
   #
   ALIASFILE=aliases.ls
   USERNAME=${1}
   #
   awk '($2==${USERNAME}) {print $1}' ${ALIASFILE} | sed -e 's/\://'


Das kann nicht gehen, weil ${USERNAME} innerhalb des Quotings nicht
expandiert wird. Wenn ich mich jetzt nicht selbst mit dem Quoting
verhampelt habe, sollte es mit folgendem Dreizeiler funktionieren:

#!/bin/bash

ALIASFILE=aliases.ls
ALIAS=`awk -F ': ' '($2=='$1') {print $1}' $ALIASFILE`
echo $1 aliased to $ALIAS

Beste Grüße - Jürgen


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Elmar W. Tischhauser
Hallo!

On 22 Sep 2004 at 14:01 +0200, Christian Schmidt wrote:

 gerade tueftele ich an einem Wrapper fuer vacation herum, der ein
 ~/.forward-File in folgendem Format erzeugen soll:
 benutzername, | vacation -A alias benutzername

 Der Alias stellt dabei das Konstrukt Vorname.Nachname dar; die Aliasse
 aller Benutzer liegen in _einer_ Datei:
 Vorname.Nachname: benutzername

 Beissen sich die Variablendeklarationen mit den intern von awk
 verwendeten?

Ja. Wenn man Shellvariablen an AWK übergeben will, muss man entweder mit
Quotingakrobatik arbeiten oder (komfortabler) awk die Variablen per
'-v'-Parameter übergeben, der für diesen Zweck vorgesehen ist.

Für deine konkrete Problemstellung würde ich etwas à la

#!/bin/sh

ALIASFILE=aliases.ls

awk -F:  -v USERNAME=${1} \
'$2 ~ USERNAME { print $2 , \| vacation -A  $1   $2 \ }' $ALIASFILE

probieren. Das '~' bewirkt ein Regex-Matching, d.h. du kannst bei Bedarf
den Skriptparameter leer lassen und somit eine Gesamtübersicht bekommen
oder mit einem beliebige regulären Ausdruck arbeiten. Wenn natürlich
einige Benutzernamen als Teilstring von anderen vorkommen können, wäre
'==' besser.

Übrigens: Wenn das Leerzeichen nach dem ':' nicht garantiert ist,
arbeitest du besser mit : an Stelle von :  als Feldtrenner und
trimmst wenn nötig das Leerzeichen in $2 mit gsub o.ä. weg.

Gruß,
Elmar

-- 
[ GnuPG: D8A88C0D / 2407 063C 1C92 90E9 4766 B170 5E95 0D7F D8A8 8C0D ]
···
  There is no sadder sight than a young pessimist.


pgpEwLmWCC4wt.pgp
Description: PGP signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Heike C. Zimmerer
Christian Schmidt [EMAIL PROTECTED] writes:

 Wenn ich das bisher erwaehnte in einem Shellskript formuliere:

 #!/bin/bash
   #
   ALIASFILE=aliases.ls
   USERNAME=${1}
   #
   awk '($2==${USERNAME}) {print $1}' ${ALIASFILE} | sed -e 's/\://'

 ...dann passiert nichts - ich bekomme keine Ausgabe.

Das gibt nur was aus, wenn $2 exakt den String ${USERNAME} enthält.
Was du meinst, ist vermutlich:

   awk '($2=='${USERNAME}') {print $1}' ${ALIASFILE} | sed -e 's/\://'
  ^ ^  

Die Klammern um USERNAME sind überflüssig - sowohl die geschweiften
als auch die runden (um den ganzen Ausdruck).  Aber sie stören
natürlich nicht.

Die Shell kann aber schließlich selbst splitten und ersetzen.
Insgesamt würde ich es daher eher so in dieser Art probieren:

#!/bin/bash
set $(egrep .*: +$USERNAME$) $ALIASFILE
echo $USERNAME, | vacation -A ${1/:/} $USERNAME

soweit ich bei deiner Beschreibung auf die Schnelle durchgestiegen
bin (ungetestet).

Gruß,

 Heike


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Heike C. Zimmerer
Kleine Ergänzung:

Falls das Argument zu set leer sein kann (der Username also nicht
existiert):


#!/bin/bash
set x$(egrep .*: +$USERNAME$) $ALIASFILE
^
echo $USERNAME, | vacation -A ${2/:/} $USERNAME
 ^

Fiel mir noch ein. 


Gruß,

 Heike


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Christian Schmidt
Hallo Michelle,

Michelle Konzack, 22.09.2004 (d.m.y):

 
 Am 2004-09-22 14:01:42, schrieb Christian Schmidt:
 
  Der Alias stellt dabei das Konstrukt Vorname.Nachname dar; die Aliasse
  aller Benutzer liegen in _einer_ Datei:
  Vorname.Nachname: benutzername
  Also beispielsweise:
  Christian.Schmidt: schmidtc
 
 also ich würde das umgedreht schreiben also
 
 schmidtc:Christian.Schmidt

Wirf doch mal bitte einen Blick in Deine /etc/aliases. Dann wirst Du
feststellen, dass in der ersten Spalte der Alias und in der zweiten
der Benutzername steht, an den entsprechende Mails weitergeleitet
werden sollen. Vielleicht verstehst Du dann, warum es so herum
funktionieren muss...

Gruss,
Christian
-- 
Die Erde erwärmt sich immer mehr, die Sommer werden immer wärmer und länger,
aber die Ferien bleiben so kurz!


signature.asc
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Christian Schmidt
Hallo Frank,

Frank Dietrich, 22.09.2004 (d.m.y):

 Vielleicht als Lösungsansatz 
 
 echo Christian.Schmidt: schmidtc | sed -n \
 's/^\(.*\)\.\(.*\):\(.*schmidtc.*\)/-A \1.\2/p'
 
 Mit awk geht sicher auch, aber damit kenn ich mich nicht sonderlich
 gut aus.

Es geht mir darum, das Heraussuchen der richtigen Zeile mit den
anderen Aufgaben zusammen in einem Aufwasch (bzw. awk-Aufruf) zu
erledigen...

Sollte awk dafuer nicht das Werkzeug der Wahl sein, so bin ich auch
gerne offen fuer Alternativen. ;-)

Gruss  Dank,
Christian
-- 
Der Reiche hat nie das schöne Gefühl, die letzte Rate zu zahlen.
-- Peter Gall


signature.asc
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Christian Schmidt
Hallo Juergen,

Juergen Salk, 22.09.2004 (d.m.y):

 Christian Schmidt [EMAIL PROTECTED] wrote:
 
  #!/bin/bash
#
ALIASFILE=aliases.ls
USERNAME=${1}
#
awk '($2==${USERNAME}) {print $1}' ${ALIASFILE} | sed -e 's/\://'
 
 
 Das kann nicht gehen, weil ${USERNAME} innerhalb des Quotings nicht
 expandiert wird.

Ich ahnte so etwas schon... ;-)

 Wenn ich mich jetzt nicht selbst mit dem Quoting
 verhampelt habe, sollte es mit folgendem Dreizeiler funktionieren:
 
 #!/bin/bash
 
 ALIASFILE=aliases.ls
 ALIAS=`awk -F ': ' '($2=='$1') {print $1}' $ALIASFILE`
 echo $1 aliased to $ALIAS

Klappt:
./test.sh schmidtc
schmidtc aliased to Christian.Schmidt

Danke Dir vielmals!!

Bleibt nur noch das Voranstellen des -A und das Knuepfen der ganzen
Aktion an die Bedingung, dass $1 bzw. der betreffende Benutzername
auch in der Aliases-Datei gefunden wird...

Gruss,
Christian
-- 
Denn alles Vornehme ist eigentlich ablehnend.
-- Johann Wolfgang von Goethe (Dichtung und Wahrheit III)


signature.asc
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Christian Schmidt
Hallo Elmar,

Elmar W. Tischhauser, 22.09.2004 (d.m.y):

 On 22 Sep 2004 at 14:01 +0200, Christian Schmidt wrote:
 
  Beissen sich die Variablendeklarationen mit den intern von awk
  verwendeten?
 
 Ja. Wenn man Shellvariablen an AWK übergeben will, muss man entweder mit
 Quotingakrobatik arbeiten oder (komfortabler) awk die Variablen per
 '-v'-Parameter übergeben, der für diesen Zweck vorgesehen ist.

Ahja.

 Für deine konkrete Problemstellung würde ich etwas à la
 #!/bin/sh
 ALIASFILE=aliases.ls
 awk -F:  -v USERNAME=${1} \
 '$2 ~ USERNAME { print $2 , \| vacation -A  $1   $2 \ }' $ALIASFILE
 
 probieren. Das '~' bewirkt ein Regex-Matching, d.h. du kannst bei Bedarf
 den Skriptparameter leer lassen und somit eine Gesamtübersicht bekommen
 oder mit einem beliebige regulären Ausdruck arbeiten. Wenn natürlich
 einige Benutzernamen als Teilstring von anderen vorkommen können, wäre
 '==' besser.

..also in der zweiten Zeile des o.a. awk-Aufrufs $2==USERNAME anstelle von 
$2 ~ USERNAME?
Es waere schon wichtig, dass awk bei Angabe von schmidt nicht auch
schmidtc hervorpult...

[einige Minuten spaeter]
...was in der Variante mit den beiden Gleichheitszeichen auch erreicht
wird:
 $ ./test2.sh schmidtc
 schmidtc, | vacation -A Christian.Schmidt schmidtc
Dagegen:
 $ ./test2.sh schmidt
 $

Vielen Dank, Elmar. Das ist so auf den ersten Blick genau das, was ich
gesucht habe!

 Übrigens: Wenn das Leerzeichen nach dem ':' nicht garantiert ist,
 arbeitest du besser mit : an Stelle von :  als Feldtrenner und
 trimmst wenn nötig das Leerzeichen in $2 mit gsub o.ä. weg.

Ich muss noch einmal nachsehen, meine aber, dass das Leerzeichen
garantiert ist. Die aliases.ls wird auf von einem anderen Skript generiert...

Gruss,
Christian
-- 
Angenehm sind die erledigten Arbeiten.
-- Marcus Tullius Cicero (106-43 v.Chr.)


signature.asc
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Michelle Konzack
Am 2004-09-22 16:36:46, schrieb Christian Schmidt:
 Hallo Michelle,
 
 Michelle Konzack, 22.09.2004 (d.m.y):
 
  
  Am 2004-09-22 14:01:42, schrieb Christian Schmidt:
  
   Der Alias stellt dabei das Konstrukt Vorname.Nachname dar; die Aliasse
   aller Benutzer liegen in _einer_ Datei:
   Vorname.Nachname: benutzername
   Also beispielsweise:
   Christian.Schmidt: schmidtc
  
  also ich würde das umgedreht schreiben also
  
  schmidtc:Christian.Schmidt
 
 Wirf doch mal bitte einen Blick in Deine /etc/aliases. Dann wirst Du
 feststellen, dass in der ersten Spalte der Alias und in der zweiten

Sowas habe ich nicht :-)

 der Benutzername steht, an den entsprechende Mails weitergeleitet
 werden sollen. Vielleicht verstehst Du dann, warum es so herum
 funktionieren muss...

Christian.Schmidt: schmidtc

Dann mach ebend:

grep : schmidtc$ alias.ls | sed -e s/\:.*[a-z0-9]$//

 Gruss,
 Christian

Greetings
Michelle

-- 
Linux-User #280138 with the Linux Counter, http://counter.li.org/ 
Michelle Konzack   Apt. 917  ICQ #328449886
   50, rue de Soultz MSM LinuxMichi
0033/3/8845235667100 Strasbourg/France   IRC #Debian (irc.icq.com)


signature.pgp
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Christian Schmidt
Hallo Heike,

auch an Dich ein Dankeschoen!

Ich habe jetzt folgendes Skript zusammen, in das ich einige Eurer
Vorschlaege habe einfliessen lassen:

#!/bin/bash
#
ALIASFILE=aliases.ls
# 
# Usernamen als Argument:
USER=${1}
#
# Alias extrahieren, sofern vorhanden.
# Gibt wenn vorhanden, den Alias und sonst nichts zurueck:
#
ALIAS=`awk -F:  -v USER=${USER} \
'$2==USER { print $2 , \| /usr/bin/vacation -A  $1   $2 \ }' $ALIASFILE`
#
# Teste $ALIAS auf Laenge 0:
#
if [ ! {$ALIAS}=\n ];
  then echo ${ALIAS}
  else echo ${USER}, \| /usr/bin/vacation ${USER}\
fi

Es funktioniert auch fast:
- Gibt man als Argument einen nicht in $ALIASFILE existenten Namen an,
  so wird der erste Zweig der if..then-Verknuepfung verwendet:

  $ ./test4.sh schmidt 
  schmidt, | /usr/bin/vacation schmidt

- Gebe ich nun aber einen in $ALIASFILE existenten Benutzernamen an,
  so kommt zwar das richtige Ergebnis heraus, zunaechst aber eine
  Fehlermeldung:

  $ ./test4.sh schmidtc
  ./test4.sh: line 16: [: too many arguments
  schmidtc, | /usr/bin/vacation schmidtc

Ansonsten bin ich mal wieder beeindruckt, was man mit ein wenig
Geskripte so alles erreichen kann... ;-)

Gruss  Dank,
Christian
-- 
Ein Kaufmann macht durch allzu großes Rühmen die Ware, die ihm feil
ist, nur verdächtig.
-- Quintus Flaccus Horaz (65-8 v.Chr.)


signature.asc
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Juergen Salk
* Christian Schmidt [EMAIL PROTECTED] [040922 18:39]:

 #
 # Teste $ALIAS auf Laenge 0:
 #
 if [ ! {$ALIAS}=\n ];
 ...

  if [ ! -z $ALIAS ];
  ...

Beste Grüße - Jürgen

-- 
GPG A997BA7A | 87FC DA31 5F00 C885 0DC3  E28F BD0D 4B33 A997 BA7A


signature.asc
Description: Digital signature


Re: [OT] awk-Akrobatik

2004-09-22 Diskussionsfäden Christian Schmidt
Hallo Juergen, *

Juergen Salk, 22.09.2004 (d.m.y):

   if [ ! -z $ALIAS ];

Aua... Steht ja auch deutlichst in man test...

Naja, es klappt jetzt mit folgendem Skript:

#!/bin/bash
#
ALIASFILE=aliases.ls
# 
# Usernamen als Argument:
USER=${1}
#
# Alias extrahieren, sofern vorhanden.
# Gibt wenn vorhanden, den Alias und sonst nichts zurueck:
#
ALIAS=`awk -F:  -v USER=${USER} \
'$2==USER { print $2 , \| /usr/bin/vacation -A  $1   $2 \ }' $ALIASFILE`
#
# Teste $ALIAS auf Laenge 0:
#
if [ ! -z $ALIAS ];
  then echo ${ALIAS}
  else echo ${USER}, \| /usr/bin/vacation ${USER}\
fi

Tausend Dank an alle, die unterstuetzend eingegriffen haben!!

Gruss,
Christian
-- 
Denken ist schwer, darum urteilen die meisten.
-- Carl Gustav Jung


signature.asc
Description: Digital signature