Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

26.03.2006, 10:05

[gelöst] Problem mit cut bei mehreren Leerzeichen

Hi,

ich möchte gerne mit ps auxw nur die PID Spalte ausgeben.

Leider befinden sich zwischen der ersten ersten und 2. Spalte mehrere Leerzeichen und nicht alle PIDs haben gleichviele Ziffern.

Somit funtkioniert ps auxw | cut -d " " -f4 nicht.

Kann man ps dazu bringen, dass er die Spalten mit einem richtigen Tabulator getrennt ausgibt oder kann man bei cut irgendwie mehrere aufeinanderfolgende Leerzeichen filtern?

Liebe Grüsse.

bonsai

Prof.Dr. Klugschiss

  • »bonsai« ist männlich

Beiträge: 1 486

Wohnort: N.de

Beruf: Informatiker

  • Nachricht senden

2

26.03.2006, 10:34

Teste mal

awk

Nachdem ich zu doof fuer die Anfuehrungszeichen bin - laesst Du es Dir bitte von Jemand anderem pasten.

Der awk-befehl ist trivial: print $4
Die erste programmgesteuerte Rechenmaschine (Z1) wurde Mitte der 30er Jahre als "nicht patentwürdig" eingestuft. Warum versaut mir das Ding 50 Jahre später immer noch den Tag?

3

26.03.2006, 10:44

Hab nur Beispiele für Scripts gefunden; ich würde das aber gerne in der kommandozeile realisieren!?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

4

26.03.2006, 11:35

ja das ist ganz logisch, da jetzt jedes leerzeichen ein trennzeichen ist und damit das 4-te feld hinter dem dritten leerzeichen liegt. wie bonsai schon gesagt hat ist awk eine gute alternative, also

Quellcode

1
ps auxw | awk '{ print $4 }'


@bonsai

he, nichts für ungut, aber die diskussion mit strcat bezog sich gar nicht auf dich, sondern auf mich. für mich war das ein mittlerer kulturschock, das die von dir beschriebene awk-zeile ÜBERHAUPT funktioniert hat. heute weiss ich warum und ich lebe ruhiger. und deine zeile war deshalb auch richtig, wenn auch ungewöhnlich.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

5

26.03.2006, 12:02

``ps -eopid'' is zu einfach oder?
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

6

26.03.2006, 14:10

Hi!

Danke für eure beiden Lösungsvorschläge! :+++:

Liebe Grüsse.

bonsai

Prof.Dr. Klugschiss

  • »bonsai« ist männlich

Beiträge: 1 486

Wohnort: N.de

Beruf: Informatiker

  • Nachricht senden

7

26.03.2006, 15:04

Zitat

he, nichts für ungut, aber die diskussion mit strcat bezog sich gar nicht auf dich, sondern auf mich. für mich war das ein mittlerer kulturschock, das die von dir beschriebene awk-zeile ÜBERHAUPT funktioniert hat. heute weiss ich warum und ich lebe ruhiger. und deine zeile war deshalb auch richtig, wenn auch ungewöhnlich.


*hehe* war auch witzig gemeint. Nein, wirklich nichts fuer ungut - ich weiss nur nicht mehr, wie es richtig war und wollte mich nicht blamieren. ;)
Die erste programmgesteuerte Rechenmaschine (Z1) wurde Mitte der 30er Jahre als "nicht patentwürdig" eingestuft. Warum versaut mir das Ding 50 Jahre später immer noch den Tag?

8

26.03.2006, 20:19

Hi,

hat vielleicht jemand eine Idee, wie ich diese Aufgabe angehen könnte?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Schreiben Sie ein einfaches Bash-Skript mydo, welches alle Unterverzeichnisse im
aktuellen Verzeichnis auflistet und deren Gr¨ossen in MegaByte ausgibt. Abschliessend
soll der Gesamtverbrauch ausgegeben werden. Benutzen Sie dazu Schleifen und den
Befehl du mit den entsprechenden Optionen.

mike@mars:˜> ./mydu /opt
320M /opt/cxoffice
98M /opt/gnome
15M /opt/insight
703M /opt/kde3
31M /opt/mozilla
239M /opt/OpenOffice.org
32M /opt/snavigator
0 /opt/stuff

SUM: 1.5G /opt


Liebe Grüsse.

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

9

26.03.2006, 22:01

Die Ausgabe der Verzeichnisse wuerde ich mit

Quellcode

1
find /opt -type d -exec du --block-size=M {} \;

erzeugen und dann an awk(1) pipen damit es addiert wird

Quellcode

1
 | awk '{ sum+=$1 } END { print "Total:", sum }'

Is aber mehr als eklig; ausserdem fork()'t es wenn die Verzeichnisstruktur tiefer als 32768 Subdirs geht.
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

10

26.03.2006, 23:07

Hi!

Danke für die Hinweise.

Da es nicht so professionell sein muss, macht mir das mit der begrenzten Tiefe nichts. :)

Liebe Grüsse.

11

26.03.2006, 23:16

noch eine Frage:

Da das Script das auszulesende Verzeichnis per Parameter übergeben bekommen soll, tauchte nun die Frage auf, wie ich den Parameter übernehmen kann!?

Parameterproblem ist schon gelöst! =D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »onlineuser« (26.03.2006, 23:21)


strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

12

26.03.2006, 23:27

Nimm $@ statt $1
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

13

26.03.2006, 23:29

ok danke! *g*

was ist der utnerschied zwischen $1 und $@?

warum meinte der prof in der angabe, dass man den Befehl du verwenden soll?

hab mir grad ein paar beispiele angeschaut und die sind ja viel komplexer als deine idee. :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »onlineuser« (26.03.2006, 23:30)


strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

14

27.03.2006, 00:06

Zitat

Original von onlineuser
was ist der utnerschied zwischen $1 und $@?


$ man bash | less -p '.*Special Parameters$'

$@ sind alle Positionsparamater als einzelne Strings; $1 ist nur der erste Parameter.

Zitat

warum meinte der prof in der angabe, dass man den Befehl du verwenden soll?


Weil du(1) die Datei-/Verzeichnissgroesse ausgibt.
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

15

27.03.2006, 16:13

Zitat

Original von strcat
Die Ausgabe der Verzeichnisse wuerde ich mit

Quellcode

1
find /opt -type d -exec du --block-size=M {} \;

erzeugen und dann an awk(1) pipen damit es addiert wird

Quellcode

1
 | awk '{ sum+=$1 } END { print "Total:", sum }'

Is aber mehr als eklig; ausserdem fork()'t es wenn die Verzeichnisstruktur tiefer als 32768 Subdirs geht.


Hi,

die erste Zeile ist klar, jedoch check ich die zweite nicht ganz.

Habe die erste Zeile in eienr Variablen zwischengespeichert und dann die Größe immer zur Summe addiert, aber irgendwie scheitn es nicht zu funzen.

Wechselt die Einheit eigentlich bei Erreichen von einem Gigabyte automatisch von MB auf GB?

Liebe Grüsse.

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

16

27.03.2006, 16:30

``sum+$1'' summiert jeweils das erste Feld jeder Zeile in der Variablen "sum" auf und gibt den Wert und die Summe aus. Die Groesse wird in dem Beispiel eh immer in MB ausgegeben.
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

17

27.03.2006, 16:34

Also ich pipe den awk Ausdruck an den Inhalt, den die erste Zeile produziert, oder?

Ist meine Denkweise richtig? Weil du geschrieben hast, dass du mit awk(1) pipest!?

strcat

Unix Gladiator

  • »strcat« ist männlich

Beiträge: 2 331

Wohnort: /Earth/Germany/Bavaria/Regensburg

  • Nachricht senden

18

27.03.2006, 17:04

STDOUT von find(1) wird ueber eine Pipe an awk(1) geschickt. Also

Quellcode

1
find ... | awk ..
Christian 'strcat' Schneider <http://www.strcat.de/>
/* When all else fails, read the instructions. */

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

19

27.03.2006, 17:15

häng die beiden zeilen mit der pipe dazwischen einfach hintereiander und es läuft. der angezeigte wert Total ist aber nicht sehr verlässlich, weil in dieser variante find ja alle verzeichnisse (auch schachtelungen) ausgibt. dadurch ermittelt du den plattenplatz eines unterverzeichnisses mehrmals (das übergeordnete verzeichnis enthält die datenkapazität der untergeordneten verzeichnisse) sodass der Total-Wert viel zu gross ist.
wie wäre es mit
du --block-size=M /home | tail -1 | awk '{ print $1 }'
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

20

27.03.2006, 22:53

Zitat

Original von strcat
STDOUT von find(1) wird ueber eine Pipe an awk(1) geschickt. Also

Quellcode

1
find ... | awk ..


Hi!

Ich komm da nicht weiter. Ich schaffe es nicht den find und den awk zu pipen.

Hab schon jede Syntax probiert, aber sobald ich pipe, meint er, dass -exec ein fehlendes Argument hätte.

Quellcode

1
find $@ -type d -exec du --block-size=M {} \ | awk '{ sum+=$1 } END { print "Total: ", sum }'


In der Angabe wurde als Lösungsweg die Idee einer Schleife erwähnt. Kann ich damit vielleicht verhindern, dass Verzeichnisse doppelt gezählt werden?

@linuxerr: deine Variante funzt super, aber ich würde es doch gerne mit der ersten Variante auch zum Laufen bekommen bzw. mit den Schleifen, wie in der Aufgabenstellung gefordert ist.

Liebe Grüsse.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »onlineuser« (27.03.2006, 22:57)


Thema bewerten