ubuntuusers.de

Richtiger cut-Befehl?

Status: Gelöst | Ubuntu-Version: Server 12.04 (Precise Pangolin)
Antworten |

Halmla

Anmeldungsdatum:
24. Mai 2016

Beiträge: 4

Wohnort: Bietigheim-Bissingen

Hallo zusammen,

ich bin blutiger Anfänger in der Linux-Welt und arbeite mich gerade erst so richtig in die Materie ein. Sorry also jetzt schon für die laienhaften Frage, die von mir kommt und weitere die evtl. noch kommen werden.

Es geht um folgendes. Ich möchte einen Befehl n einem m Skript einbauen, um bestimmte Informationen in einer Serverlogfile auszugeben. Dabei sollen nur die Stunde (keine Minute, Sekunde usw.) und der jeweiligen User (welcher auf dem Server war) angegeben werden.

Ich bin nun mal davon ausgegangen, dass ich mit "cut" die jeweiligen Infos quasi herausfiltern kann.

Ich bin jetzt mal soweit gekommen.

Ich habe bspw. folgende Ausgangsbasis

-2016-05-10 11:47:12,235:[D5791C7E58414640417726310J1EE955.hcnefap][mcdonald  ][MSIE 11   ][useCase   ][INFO ][MpOfferController$9.perform:439] .............................. : Save configuration to DIWI, name=93BAA1_IPhone_051016 
-2016-05-10 12:30:27,501:[D5791C7E58414640417726310J1EE955.hcnefap][mcdonald  ][MSIE 11   ][useCase   ][INFO ][MpOfferController$9.perform:439] .............................. : Save configuration to DIWI, name=93BAB1_IPhone S_051016
-...
-...
-...

Mit dem Befehl:

1
cat Session_usaquhanb14.beispiel.org_2016-05-10_tomcat_hcnefap.log | grep -v "home" | grep -v "Connection" | cut -d[ -f3,1 | cut -d] -f1 | sort -u

habe ich u.a. folgende Ausgabe erhalten:

-2016-05-10 11:47:12,235:[mcdonald
-2016-05-10 12:18:11,745:[mcdonald   
-2016-05-10 12:30:27,501:[mcdonald   
-2016-05-10 12:36:23,614:[mcdonald   
-2016-05-10 13:44:20,866:[mcdonald  
-2016-05-10 13:50:13,364:[mcdonald
-...
-...
-...

Ich möchte ja aber eine Ausgabe in folgender Art erhalten:

-11, mcdonald
-12, mcdonald  
-12, mcdonald
-12, mcdonald
-13, mcdonald
-13, mcdonald
-...
-...
-...

Hat jemand eine Idee, wie ich den Befehl abändern muss? Vielleicht hilft hier auch ein anderer Befehl als "cut"? Ich wäre wirklich sehr sehr dankbar für jede Hilfe.

Gruß
Halmla

Bearbeitet von rklm:

Codeblöcke spendiert. Bitte mach Dich mit der Forum/Syntax vertraut!

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Wohnort: south central EL

Ich glaube, du möchtest awk benutzen.

Halmla

(Themenstarter)

Anmeldungsdatum:
24. Mai 2016

Beiträge: 4

Wohnort: Bietigheim-Bissingen

Hi mrkramps,

vielen Dank für Deine Hilfe. Allerdings wirft die für mich mehr Fragen auf, als sie beantwortet;-) Wie gesagt, ich bin ein Anfänger. Ich hab mir awk mal angesehen aber eine neue Abfrage für meine Bedürfnisse konnte ich nicht wirklich darauf anpassen. Kannst Du oder alle anderen da einen weiteren Schupser in die richtige Richtung geben?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Halmla,

erstmal willkommen hier auf dem Forum !

Ja, bei sowas denke ich auch an awk. - allerdings kann man Deine Daten ja praktisch gar nicht lesen !
→ Du solltest Code unbedingt in einen {{{Codeblock}}} setzen (siehe das Blatt mit dem Zahnrad im Editor-Fenster !).
Dann sähen Deine Daten so aus:

-2016-05-10 11:47:12,235:[D5791C7E58414640417726310J1EE955.hcnefap][mcdonald  ][MSIE 11   ][useCase   ][INFO ][MpOfferController$9.perform:439] .............................. : Save configuration to DIWI, name=93BAA1_IPhone_051016
-2016-05-10 12:30:27,501:[D5791C7E58414640417726310J1EE955.hcnefap][mcdonald  ][MSIE 11   ][useCase   ][INFO ][MpOfferController$9.perform:439] .............................. : Save configuration to DIWI, name=93BAB1_IPhone S_051016

Wenn ich den Kram mal an so einen awk- Einzeiler verfüttere, dann kommt bei mir das raus:

track@track:~$ awk -F '[[ ]' '{OFS=", "; print substr($2,1,2), $4}'   Session_usaquhanb14.beispiel.org_2016-05-10_tomcat_hcnefap.log
11, mcdonald
12, mcdonald
, 

Als Eingangs-Worttrenner habe ich mal alles was "[" oder " " heißt (als Zeichenklase) genommen, und als Ausgangs-Worttrenner die Kombination ", " .
Dann wären es die ersten 2 Zeichen des 2. Wortes und das 4. Wort, soweit ich es begreife.

Allerdings bin ich mir nicht so ganz sicher, ob Du wirklich echte Beispieldaten geliefert hast.
Denn Zeilen mit "Home" oder "Connection" gibt es darin überhaupt nicht.

Vielleicht solltest Du uns doch besser mal eine Problembeschreibung geben, statt dass wir aus Deinem Code erraten müssen, was Du vorhast ?
😉

LG,

track

Tron0070

Avatar von Tron0070

Anmeldungsdatum:
22. März 2010

Beiträge: 195

Wohnort: Chemnitz

Ich mach so was auch lieber mit cut, da mir awk ehrlich gesagt etwas zu schwierig ist.

1
2
3
cut -d" " -f2 Session_usaquhanb14.beispiel.org_2016-05-10_tomcat_hcnefap.log | cut -d[ -f1,3|cut -d: -f1,4 | sed -e 's/:\[/, /'
11, mcdonald
12, mcdonald

Halmla

(Themenstarter)

Anmeldungsdatum:
24. Mai 2016

Beiträge: 4

Wohnort: Bietigheim-Bissingen

Okay, ich hab es jetzt tatsächlich genauso bzw. ähnlich hinbekommen wie Tron0070 es bereits geschrieben hat. Danke nochmals Tron0070. Allerdings hier noch mit einigen weiter zusätzlichen und nachführenden Schritten wie bspw. Sortierung.

1
Session_usaquhanb14.beispiel.org_2016-05-10_tomcat_hcnefap.log | grep -v "home" | grep -v "Connection" | cut -d[ -f3,1 | cut -d] -f1 | sort -u | sed "s/20[0-9][0-9]-[0-1][0-9]-[0-3][0-9]//" | sed "s/,/:/" | sed "s/\[//"| cut -d: -f1,5 | sort -u

Ich glaube für meine ursprüngliche Anfrage war grade die sed-Funktion entscheidend.

Zugegeben hab ich das nur nur mit der Hilfe eines Kollegen hinbekommen;-) In awk konnte ich mich noch nicht einarbeiten, muss ich mir allerdings auch unbedingt mal ansehen.

@track: Danke für den Hinweis auch mit dem Codeblock. Werde ich in Zukunft darauf achten. Das mit den echten Beispieldaten stimmt natürlich. Ich wollte hier nur keine Daten herausgeben, die evtl. nicht wirklich an die Öffentlichkeit sollten. Du siehst, ich hab wirklich kaum Ahnung von der Materie ☹

Auf jeden Fall schon mal ein großes Dankeschön für die Hilfe von Euch.

Falls mir jemand Literaturtipps, Links u.ä. zum Thema Script, Bash, Unix, Putty u.ä. für absolute Einsteiger empfehlen kann, bitte sehr gerne mir mitteilen. Ich bin wirklich ganz am Anfang und möchte/muss mich da für berufliche Zwecke unbedingt einarbeiten.

Viele Grüße Halmla

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Wohnort: Germany

Willkommen!

Dann empfehle ich dir mal den Shell/Bash-Skripting-Guide für Anfänger, der ist wirklich gut - wie der Rest des Wikis auch. Beginne mit Unterschiede zu Windows und den Grundlagen. Für Server, leg dir eine Shell/Befehlsübersicht zurecht, gibt es auf einem Blatt ausdruckbar.

Um am Beispiel zu lernen: Das, was dein Kollege da macht, sind viele Shell/Umleitungen (Abschnitt „Der-Pipe-Operator“). Aber seid ihr sicher, dass sort -u zweimal nötig ist und das erste dann nicht wegfallen kann? Spart "Zeit".

Ich finde cut auch griffiger, aber von track kann man ab und zu ein paar schöne awk-Kniffe lernen. Besonders gern nutze ich es, um Spalten auszuschneiden. cut scheitert da oft, weil je nach Datenlänge mehr oder weniger Leerzeichen zwischen den Spalten sind. Aber awk packt das problemlos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ echo "eins   zwei   drei" | cut -d" " -f2

$ echo "eins   zwei   drei" | cut -d" " -f3

$ echo "eins   zwei   drei" | cut -d" " -f4
zwei
$ echo "eins   zwei   drei" | cut -d" " -f5

$ echo "eins   zwei   drei" | awk '{ print $2  }'
zwei
$ 

Bei awk reicht also 2, bei cut muss man die Leerzeichen zwischen eins und zwei zählen - da es drei Leerzeichen sind, wäre erst das Feld 4 der Wert zwei. Eigentlich sogar erst Feld 5, aber eins der Leerzeichen wird als Trennzeichen gewertet und rausgerechnet...

Für schwankende Längen in Ausgaben ist cut also unbrauchbar und dieser awk-Einzeiler sehr robust und sehr einfach auch für awk-Einsteiger (wo man alles Einsteiger sein kann, wenn man glaubt, Linux-Einsteiger zu sein, reicht schon 😲) anzuwenden und zu merken.

Es sollte halt alles in einfache Anführungszeichen und Klammern, schön mit Leerzeichen drin. Drin wiederum darf kein Anführungszeichen um die Spalte "$2", auch kein doppeltes. Dann klappt's super. 👍 Außer, track hat noch was anzumerken. 😈

Grüße, Benno

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Für awk gibt es eine hübsche "Einführung in awk", und sonst natürlich man awk als Nachschlagewerk für die Details.

Aber, wenn Dir sed mehr liegt, kannst Du das ganze ge.cut.te auch gleich dabei mit erledigen:

track@track:~$ sed 's/[^ ]* //; s/:[^]]*]//; s/\[/, /; s/].*//'   Session_usaquhanb14.beispiel.org_2016-05-10_tomcat_hcnefap.log
11, mcdonald
12, mcdonald 

Da ist die Strategie eine etwas andere: ich habe der Reihe nach weggeschnitten, was mich störte:

  1. den Anfang bis zum 1. Leerzeichen einschließlich,

  2. den ganzen Kram vom ":" bis zur ersten "]"

  3. die öffnende Klammer, wird durch den neuen Trenner ", " ersetzt

  4. den Rest von der "]" bis zum Ende.

Statt der grep -v kann man die störenden Zeilen aber auch ganz einfach löschen, wenn man will:

track@track:~$ sed '/home/d; /Connection/d; s/[^ ]* //; s/:[^]]*]//; s/\[/, /; s/].*//'   Session_usaquhanb14.beispiel.org_2016-05-10_tomcat_hcnefap.log
11, mcdonald  
12, mcdonald 

LG,

track

Tron0070

Avatar von Tron0070

Anmeldungsdatum:
22. März 2010

Beiträge: 195

Wohnort: Chemnitz

Hallo track, dein Link "Einführung in awk" ist irgendwie nicht der Richtige.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Tron0070 schrieb:

Hallo track, dein Link "Einführung in awk" ist irgendwie nicht der Richtige.

Ja, sorry. (das Video hatte ich mir vorher kopiert und dann offenbar den alten Link eingefügt ...)

Hier ist der Link, den ich meinte: Einführung awk .

LG,

track

Halmla

(Themenstarter)

Anmeldungsdatum:
24. Mai 2016

Beiträge: 4

Wohnort: Bietigheim-Bissingen

Also vielen Dank nochmal auch für die Literaturtipps, Links usw. eben. Ich bin dran und lerne Schritt für Schritt. Wirklich klasse Eure Hilfsbereitschaft. 👍

Antworten |