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

SED und oder AWK ??

troubadix

Newbie
Hallo,

zuerst mal mein kleines Problemchen ;)

Ich will herausfinden welche Oracle Datenbanken derzeit laufen und diese mit dem Instanznamen in eine Datei reinspoolen.

Die Datenbanken bekomme ich mit ps -ef|grep pmon raus und erhalte folgende Ausgabe:

oracle 7138 1 0 Nov 12 ? 0:01 ora_pmon_DBRMDIFB
oracle 27276 1 0 09:45:01 ? 0:00 ora_pmon_DBRMDLYD
oracle 29616 26672 0 10:20:15 pts/1 0:00 grep pmon_
oracle 7880 1 0 Nov 23 ? 0:01 ora_pmon_DBRMDLYE
oracle 6837 1 0 Nov 08 ? 0:01 ora_pmon_DBRMRNP

Nun hätte ich gerne eine Datei die wie folgt aussieht:

DBRMDIFB
DBRMDLYD
DBRMDLYE
DBRMRNP

Wie bekomme ich das am einfachsten mittels sed oder awk hin ?

Des weiteren suche ich gute Links/Tips zu dem Thema damit ich mich selbst mal in die ganze Thematik reinarbeiten kann ;)

Gruß

troubadix
 

scg

Hacker
Guck dir mal die pdf-Datei der Fernuni-Hagen an:
http://www.fernuni-hagen.de/urz/leseecke/B006.html

Steht übrigens unter dem Thema "sed und awk" in unseren "Nützlichen Links" :
http://www.linux-club.de/viewtopic.php?t=12706
 
OP
T

troubadix

Newbie
scg schrieb:
Guck dir mal die pdf-Datei der Fernuni-Hagen an:
http://www.fernuni-hagen.de/urz/leseecke/B006.html

Steht übrigens unter dem Thema "sed und awk" in unseren "Nützlichen Links" :
http://www.linux-club.de/viewtopic.php?t=12706

Danke für Deine Antwort .. aber irgendwie bekomm ich das pdf (ftp://ftp.fernuni-hagen.de/pub/pdf/urz-broschueren/broschueren/b006.pdf) nicht runtergeladen :( ) .. aber mom jetzt klappts doch hab mal ie probiert ;)

gruß

troubadix
 

scg

Hacker
Also, reden wir mal über awk, nur damit wir eine Sprache sprechen.

Gibts natürlich sehr viele verscheidene Möglichkeiten, das zu machen, was du möchtest.

EINE Idee wäre, die Eingabedatei zeilenweise zu lesen, und über die Stringfunktionen von awk den Substring
ora_pmon_
zu lokalisieren und dann eben wieder über die Stringfunktionen vom Beginn dieses Substrings bis zum Zeilenende zu extrahieren, und das dann als Ausgabe mit print rausschreiben.

Stichworte:
index, length, substr

Probier mal, und melde dich wie es dir ergangen ist. Vor allem auch, wenn du es hinbekommen hast.
 

ninguno

Member
z.b. so:
Code:
ps -ef|grep pmon|grep -v grep|while read zeile; do echo ${zeile##* }|cut -d'_' -f3; done
 
OP
T

troubadix

Newbie
ninguno schrieb:
z.b. so:
Code:
ps -ef|grep pmon|grep -v grep|while read zeile; do echo ${zeile##* }|cut -d'_' -f3; done

Danke .. jetzt probier ich nur noch das zu verstehen ;) ich schau mal ob ich nicht doch eine gute referenz online finde ...

gruß

troubadix
 

styyxx

Member
Hi,

also die while Schleife könnte man sich doch auch sparen, oder sehe ich da jetzt den Haken nicht?

Grüße
styyxx
 

ninguno

Member
mit der while schleife wird jeweils das letzte wort in der zeile ermittelt. aber stimmt nachdem vorher eh nirgends ein underscore _ vorkommt könnte man sich das auch sparen
 
Mein Vorschlag wäre:

ps -ef | sed -e '/sed/d' -e '/ora_pmon/!d' -e 's/^.*ora_pmon_//'

- -e '/sed/d' sed selber bei Ausgabe entfernen.
- -e '/ora_pmon/!d' alle Zeilen ohne ora_pmon raus
- -e 's/^.*ora_pmon //' alles einschl. ora_mon am Anfang löschen.

Die Ausgabe könnte man dann in eine Datei umleiten.

Haveaniceday
 
OP
T

troubadix

Newbie
cool gibt wohl viele Wege nach ROM ;) Werd mir mal ein gescheites Buch hierfür zulegen müssen (Vorschläge?) ..

gruß

troubadix
 

styyxx

Member
Da fällt mir ein man kann auch, wenn der Name immer so ist folgendes machen:
Code:
ps -ef | grep -v grep | grep -o DBRM.*

Ja... There is more than one way to do it!

Grüße
styyxx
 
styyxx schrieb:
Da fällt mir ein man kann auch, wenn der Name immer so ist folgendes machen:
Code:
ps -ef | grep -v grep | grep -o DBRM.*

Ja... There is more than one way to do it!

Grüße
styyxx


Abernicht vergessen 'DBRM.*' in einfache (') oder doppelte (") Anführungsstriche zu packen.
Wenn sonst z.B. in dem aktuellen Directory die Datei DBRM.nixgehtmehr existiert findet man nichts mehr.

@troubadix,
meine Bücherlernphase ist zu lange her, als dass ich Buchempfehlungen geben kann.
Ich habe aber irgendwo hier schon einige Verweise auf Tutorien gelesen.
Einmal die Woche ein online-manual zu einen Befehl genau lesen bildet
auch auf Dauer...

Haveaniceday
 

styyxx

Member
haveaniceday schrieb:
Abernicht vergessen 'DBRM.*' in einfache (') oder doppelte (") Anführungsstriche zu packen.
Wenn sonst z.B. in dem aktuellen Directory die Datei DBRM.nixgehtmehr existiert findet man nichts mehr.

Asche auf mein Haupt ....

Das kommt davon wenn man kurz vor Feierabend noch was schreibt ;-)

Grüße
styyxx
 

TeXpert

Guru
ninguno schrieb:
z.b. so:
Code:
ps -ef|grep pmon|grep -v grep|while read zeile; do echo ${zeile##* }|cut -d'_' -f3; done

auch wenn hier schon andere Dinge gekommen sind:

was soll:
Code:
echo ${zeile##* }
für einen Sinn machen? * matched auf den gesamten String, d.h. der Rest der Zeile hinter dem Match wird ausgegeben (also nix) sinniger wäre ein:
Code:
ps -ef|grep pmon|grep -v grep|while read zeile; do echo ${zeile##*pmon_ }; done
damit werden genau nur die gesuchten Namen rein mit Bash-Mitteln ausgegeben
 

ninguno

Member
TeXpert schrieb:
was soll:
Code:
echo ${zeile##* }
für einen Sinn machen? * matched auf den gesamten String, d.h. der Rest der Zeile hinter dem Match wird ausgegeben (also nix)
dass es auch einfacher ginge wurde schon gesagt, aber dieses echo liefert das letzte wort in der zeile
Code:
$ echo " oracle 7138 1 0 Nov 12 ? 0:01 ora_pmon_DBRMDIFB"|while read zeile; do echo ${zeile##* }; done
ora_pmon_DBRMDIFB

TeXpert schrieb:
sinniger wäre ein:
Code:
ps -ef|grep pmon|grep -v grep|while read zeile; do echo ${zeile##*pmon_ }; done
damit werden genau nur die gesuchten Namen rein mit Bash-Mitteln ausgegeben
das liefert genau den string den es auch liest, es macht also gar nix
Code:
$ echo " oracle 7138 1 0 Nov 12 ? 0:01 ora_pmon_DBRMDIFB"|grep pmon|grep -v grep|while read zeile; do echo ${zeile##*pmon_ }; done
oracle 7138 1 0 Nov 12 ? 0:01 ora_pmon_DBRMDIFB
wenn schon dann so
Code:
$ echo " oracle 7138 1 0 Nov 12 ? 0:01 ora_pmon_DBRMDIFB"|grep pmon|grep -v grep|while read zeile; do echo ${zeile##*ora_pmon_}; done
DBRMDIFB
 

TeXpert

Guru
ninguno schrieb:
TeXpert schrieb:
was soll:
Code:
echo ${zeile##* }
für einen Sinn machen? * matched auf den gesamten String, d.h. der Rest der Zeile hinter dem Match wird ausgegeben (also nix)
dass es auch einfacher ginge wurde schon gesagt, aber dieses echo liefert das letzte wort in der zeile

Du hast recht, ich hab das Blank überlesen, daher meine Verwunderung, denn ohne das schliessende Blank macht das keien Sinn :)
wenn schon dann so
Code:
$ echo " oracle 7138 1 0 Nov 12 ? 0:01 ora_pmon_DBRMDIFB"|grep pmon|grep -v grep|while read zeile; do echo ${zeile##*ora_pmon_}; done
DBRMDIFB
genau, das meinte ich ;) bin ich wohl beim Tippen abgerutscht :( ich hatte anscheinend meinen Blankfilter an der Brille aktiviert ..
 

regexer

Advanced Hacker
jengelh schrieb:
ps ... | perl -pe 's/^.*ora_pmon_//g'
Genau! So macht das Sinn. Nach der gleichen Logik geht das übrigens auch bei sed und awk, beides sogar ohne grep...
sed:
Code:
 ps -ef | sed -n '/sed/d;/ora_pmon_/{s/.*ora_pmon_//g;p}'
awk:
Code:
 ps -ef | awk '$8 ~ /ora_pmon_/ && $8 !~ /awk/ { sub(/.*ora_pmon_/, "",$8); print $8}'
 
Oben