awk zeichenkette schneiden

G

grechos

Eroberer
moin an alle
ich möchte gerne eine ZEichenkette mit dem awk teilen
meine zeichenkette
ist diese
6311_Events_stored_in_Event_test
ich würde nun mit awk gerne die ersten 4 zahlen aus dieser kette in eine Variable legen
Ich kenn mich aber mit dem awk nicht so gut aus kann mir jemand helfen


GRuß an alle die helfen wollen
 
Code:
[~]$ echo 6311_Events_stored_in_Event_test | awk -F_ '{print $1}'
6311

Gruss, Xanti
 
Hallo das war net schlecht
aber ich habe es jetzt mal mit einer größeren kette probiert und ich kriege wieder meine grenzen gezeigt
damit hab ich rumexperementiert

ERROR;TrackIT.EventInboundQueue;19:21:20;11.08.2006;6610_Events_stored_in_Event_Inbound_Queue;19:21:20;11.08.2006 (20060811192128) TRACKIT MON-CLIENT


von dieser kette wollte ich wieder die 6610 in eine VAriable speichern aber keine Chance

weiß jemand noch einen RAT
 
Zuletzt bearbeitet:
Dann verkettest Du awk 2x hintereinander:
echo Dein_langer_string | awk -F\; '{ print $5 }' | awk -F_ '{print $1}'
 
Einfach zuerst bei ; trennen und anschliessend bei _

edit: rikola war schneller
 
ich probiers und sach euch bescheid
ich glaube eher morgen
 
Zuletzt bearbeitet:
Hallo
Warum nimmst du nicht sed, das ist viel effizienter und braucht nur einen Prozess.
Code:
$ sed --version
GNU sed Version 4.1.4
$ cat daten
ERROR;TrackIT.EventInboundQueue;19:21:20;11.08.200 6;6610_Events_stored_in_Event_Inbound_Queue;19:21: 20;11.08.2006 (20060811192128)TRACKIT MON-CLIENT
$ VAR=$(sed -e 's/.*;\([[:digit:]]*\)_.*/\1/g' daten)
$ echo $VAR
[b]6610[/b]

Eventuell ein
Code:
while read <daten; do
VAR=$(sed -e 's/.*;\([[:digit:]]*\)_.*/\1/g' daten);
echo $VAR;
# weiteres
done

Gruß Wolfgang
 
Hallo,

ich habe mal eine Kleine Frage.
Ich habe eine Datei die folgendermaßen aussieht:

Code:
SERVICE,DASI,VNC Service,WinVNC: Stopped
SERVICE,DASI,DNS Server,Stopped
...

Wie ich das nun zerschneide ist mir klar (awk -F, '{print $1}'.
Was ich aber nun möchte ist das er Jeden Wert in eine bestimmte Variable schreibt z.B. Service in $Wert1, DASI in $WERT2 usw. Muss ich dann in einem Shell Script mehrmals AWK aufrufen bis er alles bearbeitet hat, oder kann man das auch in einem Aufruf starten?
Zudem müsste er nach dem abarbeiten der ersten Zeile diese löschen so das Zeile 2 an die Stelle von Zeile 1 rückt.
Könnte mir jemand vllt den Aufruf erstellen? Am besten noch mit ner kleine Erklärung dann muss ich nicht andauernd fragen :D

MfG

Marcel
 
Hallo zusammen,

um nicht immer gleich 'awk' zu bemühen, cut leistet beim Stringschnippeln auch ganz gute Dienste und die Syntax ist nicht ganz so komplex wie die von 'awk'.

Gruss
d22
 
Hallo
Verwende dazu einfach while read.
Auch die Shell kennt einen Feldseperator, der in der Umgebungsvariable IFS zu finden und zu setzen ist.
Code:
$ IFS=,;
$ cat testdatei|while read V1 V2 V3 V4;
 do
 echo "\$V1 hat den Wert $V1";
 echo "\$V2 hat den Wert $V2";
 done

$V1 hat den Wert SERVICE
$V2 hat den Wert DASI
$V1 hat den Wert SERVICE
$V2 hat den Wert DASI
Wir setzen IFS auf ,
Dann verfüttern wir die Ausgabe an die while read Schleife.
read weist den Variablen V1 bis V4 die Werte zu.
Gibt es mehr Werte als Variablen angegeben werden, steckt der Rest in der letzten Variable -> hier V4
man read
HTH
Gruß Wolfgang
 
Danke Wolfgang für die Mühe aber sicher das Read mein Problem lösst?
Weil das was du gepostet hattest bezieht sich ja auf alle Zeilen in der Datei. Es darf aber nur um die erste gehen. Zudem muss ja nach dem auslesen die 1. Zeile gelöscht werden und die folgenden müssen aufrücken.

MfG

Marcel
 
MarcelWie schrieb:
Danke Wolfgang für die Mühe aber sicher das Read mein Problem lösst?
Weil das was du gepostet hattest bezieht sich ja auf alle Zeilen in der Datei. Es darf aber nur um die erste gehen. Zudem muss ja nach dem auslesen die 1. Zeile gelöscht werden und die folgenden müssen aufrücken.
Genau das passiert bei jeder Zeile.
Statt echo kannst du natürlich deine Verarbeitung der Variablen einbinden.
read liest solange die Daten ein und initialisiert die Variablen, bis das Ende der Datei erreicht wird.
awk macht das auch nicht anders, ist aber langsamer dabei, und verbraucht einen zusätzlichen Prozess.

Was willst du mit den Werten machen?
Willst du die Datei selbst bearbeiten?

Gruß Wolfgang
 
Hallo
Also nochmal: Wenn du die Datei nur um die erste Zeile kürzen willst, nachdem du die Daten nur aus der ersten Zeile verarbeitet hast...
Code:
IFS=,;head -n1 test|while read v1 v2 v3 v4; do echo "$v1 $v2 $v3 $v4"; sed -i -ne '1!p' datei; done
Das liest die erste Zeile, speichert die Werte und löscht anschließend die erste Zeile mit GNU sed (Option -i)

Solltest du kein GNU sed haben, dann musst du die Ausgabe in eine Temporäre Datei umleiten und anschließend umkopieren.
sed -i -ne '1!p' datei >temp&& cat temp>datei&& rm -f temp;
Hoffe das habe ich diesmal richtig verstanden.
;)
Gruß Wolfgang
 
Perfekt so sollte es sein ;)
Ich bedanke mich :D

Aber eine Frage habe ich noch. Muss ich mein Script in diese While schleife einfügen. Oder gibt es auch ne Möglichkeit ohne diese Schleife.

Wenn ich es so probiere:
Code:
IFS=,;
head -n1 errors.msg|read v1 v2 v3 v4
echo $v1

funktioniert es natürlich nicht. Warum kann ich natürlich nicht sagen da meine Uinux Scripting Künste doch recht bescheiden sind ;)

MfG

Marcel
 
Vielleicht solltest Du einfach mal schreiben, was Du genau machen willst. Wo ist das Problem mit der while-Schleife? Die wird benötigt, damit jede Zeile bearbeitet wird. Ohne while-Schleife wird nur die erste Zeile bearbeitet.

Gruss, Xanti
 
Ein Programm schreibt in eine Daten bestimmte Werte. Dann soll ein Shell Script kommen was per cron alle 5 Minuten gestartet wird. Dies ließt dann die erste Zeile einer Datei aus und verarbeitet dann die Daten die in der ersten Zeile dieser Datei stehen. Nach bearbeiten des Scripts soll dann die erste Zeile gelöscht werden so das Zeile 2 auf Zeile 1 aufrückt.

Das Script von Wolfgang erfüllt ja diese aufgabe zu 100%.
Code:
IFS=,;head -n1 test|while read v1 v2 v3 v4; do echo "$v1 $v2 $v3 $v4"; sed -i -ne '1!p' datei; done

Nur mein Problem hieran ist ja das ich die Variablen v1,v2,... nicht mehr nach der While Schleife nutzen kann (Warum auch immer, wie gesagt meine Script kenntnisse sind nicht sehr weit ausgeprägt :D). Aber ich brauche diese halt zur Verarbeitung.
Natürlich könnte ich das Script einfach in die While Schleife schreiben, aber ist das nicht extrem unsauber?

MfG

Marcel
 
Ah, jetzt versteh ich. Mit while werden garnicht alle Zeilen abgearbeitet.

Schnellschuss:

Code:
[~]$ line=$(head -n1 file); IFS=\,; set $line; unset IFS
[~]$ sed -i -ne '1d' file
[~]$ echo $1
SERVICE
[~]$ echo $2
DASI
[~]$ echo $3
VNC Service
[~]$ echo $4
WinVNC: Stopped

Gruss, Xanti
 
Zuletzt bearbeitet:
Danke, Danke, Danke :D

Das ist wirklich zu 101% was ich gesucht habe. Ich hatte mich mit AWK & Sed zwar selber versucht aber bin nicht wirklich weit gekommen. Referenz war hier das Buch "SED & AWK GE-PACKT" leider etwas schwer meiner Meinung nach für nen Einsteiger. Kennt jemand ne gute Alternative?

MfG

Marcel
 
Einfach nach "sed tutorial" oder "awk tutorial" googeln. :)
 
Moin an alle
Habe jetzt das script mit doppelten FS und awk laufen lassen funnz soweit
ein problem habe ich aber noch und zwar
wenn ich ein
################################test des Strings###############################
KOMP=`echo $MSG | awk -F\_ '{ print $1 }'`
KOMP_WEITER=`echo $KOMP | awk -F\; '{ print $5 }'`
echo "das ist der KOMPWEITER WERT : $KOMP_WEITER" >> statetest.log
################################test ENDE################################
auf folgenden Stringkette mache:
SUCCESS;TEst.test1;09:11:20;28.08.2006;18_Events_stored_in_TEst_where_Queue;09:11:21;28.08.2006
dann kriege ich im statetest.log
das ist der KOMPWEITER WERT : 18
Wenn ich aber aus:
ERROR;TEst.test1;03:47:08;26.08.2006;Error_ocurred_calling_web_application_-_SOAP:3000_-_No_testing_found;03:47:09;26.08.2006 (20060826034713) ERROR_COUNT: 0

dann kriege ich im statetest.log
das ist der KOMPWEITER WERT : Error

Das heißt ich sehe statetest.log einmal den Wert den ich haben will als Zahl (18)und einmal als Buchstaben(ERROR)

Letzendlich will ich nur aus dem Log nur die Zahl haben
Also kurzgesagt das wenn ich AWK mache dann nur auf Zahlen prüfen will
Ist dies möglich nur $5 auszudrucken wenn es eine ZAhl ist??
Code:
 
Zuletzt bearbeitet:

Ähnliche Themen

Switche abfragen über Script

Komplette Spalten aus Datei löschen.

günstiger Mehr-Kerner (CPU) für VMs

Zeilen behalten, die Werte in einem bestimmten Bereich enthalten

sed, awk oder cut : Zeichen innerhalb einer Zeichenkette kopieren

Zurück
Oben