read mit Zeilenumbruch

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
KingBonecrusher
Beiträge: 375
Registriert: 07.06.2005 09:48:43

read mit Zeilenumbruch

Beitrag von KingBonecrusher » 31.01.2007 23:14:34

Gibt es eine Möglichkeit entweder per read Daten mit Zeilenumbruch einzulesen, oder diese vorher mit grep ohne Zeilenumbruch einzulesen?

Problem ist folgedendes. Ich durchsuche mit grep eine Datei, dort gibt es 2 Treffer.

Code: Alles auswählen

TREFFER : 10
TREFFER : 20
So, nun brauche ich die 10 und die 20 getrennt in Variablen. Ich habe bisher nur geschafft den ersten Treffer zu splitten.

Code: Alles auswählen

#!/bin/sh

function READ_DATA
{
grep -i "TREFFER" DATEI1 | { IFS=":" read -a TREFFER && echo ${TREFFER[$1]}; }
}

READ_DATA $1
In dem Script oben liest read leider nur aus der ersten Zeile die Daten ein. Das klappt dann aber gut. Mit -a weise ich read an ein Array zu erstellen, welches ich dann mit $[ARRAY[0-?] abrufen kann.


So, nun meine Frage. Kann ich denn nicht schon grep anweisen die gefundenen Treffer in einer Zeile mit einem von mir gewählten Trennzeichen zu sichern? -> "TREFFER : 10 : TREFFER : 20" Oder zumindest read sagen, es handelt sch um 2 Zeilen?

Oder sollte ich das komplett anders angehen? Wie gesagt, es gibt in den Dateien 2 oder mehr Treffer, von denen ich eigentlich nur die Werte brauche.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.02.2007 09:47:42

könntest du auch so machen:

Code: Alles auswählen

gms@gms4:~$ cat x.txt

TREFFER : 10

TREFFER : 20

gms@gms4:~$ TREFFER=(`awk -F : '$1~/TREFFER/{print $2}' x.txt`)
gms@gms4:~$ echo ${TREFFER[0]}
10
gms@gms4:~$ echo ${TREFFER[1]}
20

KingBonecrusher
Beiträge: 375
Registriert: 07.06.2005 09:48:43

Beitrag von KingBonecrusher » 01.02.2007 12:25:05

Es ist auch möglich, awk dann anzuweisen bis zum Ende der Zeile lesen zulassen? Er liest nur bis zum nächsten Leerzeichen und trennt jeweils.

Code: Alles auswählen

TREFFER = Hans Uwe
${TREFFER[0]} = Hans
${TREFFER[1]} = Uwe

Ich meine, ich könnte auch die Variablen wieder verbinden, aber woher soll ich wissen wieviel in einer Zeile steht.

mfg

KingBonecrusher
Beiträge: 375
Registriert: 07.06.2005 09:48:43

Beitrag von KingBonecrusher » 01.02.2007 12:53:31

So, hab nochmal selber bisschen geguckt. Ich glaube, das Problem liegt daran, dass wenn ich die Variable Treffer einlese, die Shell selber trennt, awk macht es korrekt :(

Sollte es nicht möglich sein, anstatt des Leerzeichentrenners, NEwline einzusetzen? dann sollte doch der output von AWK in das Array einfließen, und erst an dem NEwline Zeichen ins Array kommen oder?!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.02.2007 13:16:31

sicher ist das möglich:

Code: Alles auswählen

gms@gms4:~$ TREFFER=(`awk -F : '$1~/TREFFER/{print $2}' x.txt`)
gms@gms4:~$ echo ${TREFFER[1]}
Hans
gms@gms4:~$ IFS=$'\n' TREFFER=(`awk -F : '$1~/TREFFER/{print $2}' x.txt`); unset IFS
gms@gms4:~$ echo ${TREFFER[1]}
Hans Uwe
Gruß
gms

thecrazylol
Beiträge: 94
Registriert: 26.09.2006 23:33:24
Wohnort: Leipzig
Kontaktdaten:

Beitrag von thecrazylol » 01.02.2007 14:39:36

Also wenn ich das jetzt richtig verstanden habe würde es dir helfen einzeln auf die zweite Zeile zugreifen zu können?
Ich bin zwar Anfänger aber vllt hilft es ja :D
Bsp. Code:
cat Datei | grep TREFFER | tail -n 1
Das sollte dir nur die letzte Datei ausgeben, kannst ja noch anders mit tail rumspielen, ggf in Kombination mit head!
Wenn du ne Datei mit 3 Zeilen hast und in jeder "Treffer" vorkommt und du willst an die mittlere Zeile mach einfach:
cat Datei | grep TREFFER | head -n 2 | tail -1 :-)
Debian unser, der du bist im Himmel | xD

KingBonecrusher
Beiträge: 375
Registriert: 07.06.2005 09:48:43

Beitrag von KingBonecrusher » 02.02.2007 07:33:52

Ich danke euch beiden erstmal. Hat wunderbar funktioniert, aber der Befehl von gms lässt sich besser ein eine Schleife packen. Ich muss noch einiges machen mit den Werten später ;-)

Aber head und tail konnte ich noch wonaders anwenden. Der Nachteil ist, woher soll ich wissen, wie oft die Zeile vorkommt, das lässt sich besser mit dem Beispiel von gsm machen. Ok, ich könnte jetzt auch grep die Trefferzeilen zählen lassen.

Ach ja, Du musst nicht die Datei erst mit cat an grep schicken, grep kann das auch aus einer Datei :-) 1Mikrosekunde Zeitersparnis

Wie man sieht, viele Wege führen nach Rom, und das ist gut so!

mfg

Antworten