PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script für Verzeichnisse und uid



Los_Andros
23-06-2003, 07:20
Hallo Leute,
Ich sitze hier an einem OMVS (Unix am Großrechner). Ich habe die Aufgabe bekommen ein Script zu schreiben, dass alle Verzeichnisse auf dem HFS Filesystem auflistet, die von einem Benutzer erstellt wurden.
Alle Firmenbenutzer bei uns fangen mit IZ an.

Das Ergebnis soll tabellarisch ausgegeben werden.

Ich habe mir den ls Befehl mal genau angeschaut, aber so das Richtige ist das auch nicht!

Unter OMVS haben folgende Optionen folgende Bedeutungen
-n zeigt uid und gid an
-D zeigt nur Verzeichnisse an
-R rekursiv

Ich habe mir das so vorgestellt
ls -nDR / |grep IZ

Das Problem ist jetzt aber, dass damit auch alle Verzeichnisse angezeigt werden, die mit IZ beginnen (und das sind einige).

Das Problem wollte ich jetzt evtl. mit awk lösen, bin damit aber nicht klargekommen.
Also hat jemand einen Tip, wie ich nur die Verzeichnisse und die dazugehörige UID anzeigen kann?

Jasper
23-06-2003, 12:35
Original geschrieben von Los_Andros

Das Problem wollte ich jetzt evtl. mit awk lösen, bin damit aber nicht klargekommen.
Also hat jemand einen Tip, wie ich nur die Verzeichnisse und die dazugehörige UID anzeigen kann?

mit 'find' ist das sehr einfach. ansonsten ändere den regex von grep. ich weiss jetzt nicht wie der output von ls bei dir aussieht, aber mal angenommen, der sieht so aus:

-rw-r--r-- 1 user group size datum filename

dann einfach

... | grep '^.* .* user'

-j

Los_Andros
23-06-2003, 12:46
wie würde es denn mit find aussehen?

Ich habe das mal so probiert und das funktioniert auch, nur werden mir auch alle Gruppen mit IZ mitangezeigt.
Gibt es die Möglichkeit die Gruppe auszublenden?

Wenn es mit find einfacher geht ist mir das sogar lieber, bin immer für einfachere Wege offen

juricannes
23-06-2003, 13:21
Meine Idee ist es das Grep -> ps axw | grep "[ /]pppd call" | awk '{print $1}' zubenutzen (original aus poff)
nun macht man z.B. ls -nDR | grep "[ /]..." <--- denn das "/" bedeutet nix anderes als das zeichen davor...
mein Beispiel : auf einem normalen Linux : ls -all | grep "[juri ]users"
nun zeigt er mir alle Dateien/Verzeichnisse die "juri" von der Gruppe "users" gehören allerdings zählt es nur für diesen Ordner

Wenn du mir mal einen Test ls posten könntest würde ich dir es schreiben


EDIT : Bei mir zeigt er KEINE uid oder gid an obwohl es in der ls --help drinnsteht

Los_Andros
23-06-2003, 13:36
Also:

$ ls -l
total 24
-rw-r--r-- 1 IZ00382 IZSYS1 256 Jun 23 14:18 env.txt
drwxr-xr-x 2 IZ00382 IZSYS1 8192 Jun 23 13:32 scripts

$ ls -n
total 24
-rw-r--r-- 1 382 700001 256 Jun 23 14:18 env.txt
drwxr-xr-x 2 382 700001 8192 Jun 23 13:32 scripts

Ich denke ls -l ist da besser, da jeder Benutzer bei uns mit IZ beginnt. Externe Benutzer beginnen mit IZE00XYZ, Interne mit IZ00XYZ.

$ ls -al
total 64
drwx------ 3 IZ00382 IZSYS1 8192 Jun 23 14:25 .
dr-xr-xr-x 11 OMVS TTY 0 Jun 23 09:48 ..
-rwx------ 1 IZ00382 IZSYS1 73 Jun 23 14:24 .profile
-rw------- 1 IZ00382 IZSYS1 1895 Jun 23 14:31 .sh_history
-rw-r--r-- 1 IZ00382 IZSYS1 256 Jun 23 14:18 env.txt
drwxr-xr-x 2 IZ00382 IZSYS1 8192 Jun 23 13:32 scripts

mit -a zeige ich ja lediglich die versteckten Dateien mit an


Alle Benutzer sind bei uns in der Gruppe IZSYS1.

Müsste er mir nicht so alle Benutzer anzeigen, die mit IZ beginnern und in der Gruppe IZSYS1 sind?
ls -al |grep "[IZ ]IZSYS1"
oder habe ich da was falsch verstanden? Da wird mir nämlich leider nichts angezeigt

Jasper
23-06-2003, 14:26
Original geschrieben von Los_Andros

Ich denke ls -l ist da besser, da jeder Benutzer bei uns mit IZ beginnt. Externe Benutzer beginnen mit IZE00XYZ, Interne mit IZ00XYZ.

$ ls -al
total 64
drwx------ 3 IZ00382 IZSYS1 8192 Jun 23 14:25 .
dr-xr-xr-x 11 OMVS TTY 0 Jun 23 09:48 ..
-rwx------ 1 IZ00382 IZSYS1 73 Jun 23 14:24 .profile
-rw------- 1 IZ00382 IZSYS1 1895 Jun 23 14:31 .sh_history
-rw-r--r-- 1 IZ00382 IZSYS1 256 Jun 23 14:18 env.txt
drwxr-xr-x 2 IZ00382 IZSYS1 8192 Jun 23 13:32 scripts

mit -a zeige ich ja lediglich die versteckten Dateien mit an


Alle Benutzer sind bei uns in der Gruppe IZSYS1.

Müsste er mir nicht so alle Benutzer anzeigen, die mit IZ beginnern und in der Gruppe IZSYS1 sind?
ls -al |grep "[IZ ]IZSYS1"
oder habe ich da was falsch verstanden? Da wird mir nämlich leider nichts angezeigt

ls -l | grep '^.* [0-9]* IZ.* IZSYS1'

zeigt alle einträge an, die zur gruppe IZSYS1 gehören und wo der benutzername mit IZ anfängt. am besten mit finf kombinieren:

find -type d -group IZSYS1 -printf '%u %f\n' | grep '^IZ'

find sucht alle verzeichnisse heraus, die der gruppe IZSYS1 gehören, das nachfolgende grep filter dann alle einträge heraus, deren benutzer mit IZ anfängt.

-j

Los_Andros
23-06-2003, 14:44
Ich sehe schon, dass sich das an einem OMVS etwas komplizierter gestaltet.

Also folgender Befehl funktioniert schonmal
(leider sind für find keine man pages Verfügbar!!!)
find /u -type d -group IZSYS1
/u/iz00382
/u/iz00382/scripts
/u/iz00290
/u/iz00290/alteon
/u/iz00290/bmc
/u/iz00290/bmc/ao61
/u/iz00290/bmc/ao61/cgi-bin
/u/iz00290/bmc/ao61/images
/u/iz00290/bmc/ao61/secure
/u/iz00290/bmc/ao61/secure/cgi-bin
/u/iz00290/boole
/u/iz00290/boole/proc
/u/iz00290/boole/EMAIL
/u/iz00290/boole/ERROR
/u/iz00290/boole/SAVE
/u/iz00290/boole/SERVER
/u/iz00290/boole/TICKET
/u/iz00290/ubbproc

Also Alle Verzeichnisse der Benutzer, die in der Gruppe IZSYS1 sind
leider funktioniert -printf nicht
FSUM6372 Unknown option "-printf"

Jetzt habe ich durch probieren herausgefunden, dass es noch die Option -user gibt, aber folgendes funktioniert leider nicht:

$ find /u -type d -group IZSYS1 -user IZ*
FSUM6510 find: user name "IZ*" is unknown

Verzweiflung hallo,

Trotzdem schonmal Danke für die Hilfe

Jasper
23-06-2003, 15:01
Original geschrieben von Los_Andros

Jetzt habe ich durch probieren herausgefunden, dass es noch die Option -user gibt, aber folgendes funktioniert leider nicht:

$ find /u -type d -group IZSYS1 -user IZ*
FSUM6510 find: user name "IZ*" is unknown


hmm, ohne printf bekommst du keinen namen zu dem file, damit nützt es dir nichts.

dann versuchs mal lieber mit der reinen 'ls'-variante.

-j

Los_Andros
23-06-2003, 15:02
ok, danke

falls ich noch Fragen habe, dann melde ich mich nochmal

pitu
23-06-2003, 16:08
find /u -type d -group IZSYS1 -exec ls -ld {} \; | awk '{printf "%-10s %s\n", $3, $NF}'

Grummel, ich gebs jetzt auf.
Vor dem ; MUSS ein Backslash hin. Das ; schliesst das -exec aber ohne Backslash wuerde das ; von der shell interpretiert werden.

Zusatz:
Erklaerung:
Find /u -type d -group IZSYS1 brauch ich wohl nicht erklaeren.
-exec fuert auf das gefundene Object den folgenden Befehl aus, der zwischen -exec und backslasch ; steht.

ls -d bedeutet, dass bei directories nicht der inhalt des dirs, sonderen das dir selber angezeigt wird.

{} ist ein Platzhalter innerhalb des execs fuer das gefundene Object.

Die Ausgabe wird nach awk gepipet, interessant sind Feld 3 (user) und das letzte (NF), Ausgegeben werden die mittels printf. %s bedeutet, dass an dieser Stelle ein string ausgegeben wird. -> "%s %s", $1, $2 bedeutet beim ersten %s wird $1 beim 2weiten %s $2 ausgegeben (usw).

-10 zwischen dem % und dem s bedeutet, das linksbündig (-) 10 Zeichen fuer das erste Feld reserviert werden. Da deine Nuternamen 7 bzw 8 stellen haben, hast du mindestens 2 freie stellen zwischen den beiden Teilen.

Natuerlich koenntest du den das jetzt noch folgendermassen niederschriebne:

printf "<td>%s</td><td>%s</td>", $3, $NF

Also eine Webseite daraus generieren.....


gruss,
pitu