2009-08-08 6 views
45

Ich bin in dem Versuch, alles nur nach name= grep stecken, nur Leerzeichen und alphanumerische stecken.Wie benutze ich grep um etwas nach `name =` zu bekommen?

z.B .:

name=some value here 

ich

some value here 

ich in diesem total newb bin, wird die folgende grep Spiel alles, einschließlich der name=.

grep 'name=.*' filename 

Jede Hilfe wird sehr geschätzt.

Antwort

76

Als detaillierte here Sie eine positive Lookbehind-Klausel wollen, wie zum Beispiel:

grep -P '(?<=name=)[ A-Za-z0-9]*' filename 

Die -P grep den Perl-Dialekt verwenden macht, sonst würden Sie wahrscheinlich entkommen müssen die Klammern. Sie können auch, wie an anderer Stelle angegeben, den Parameter -o anfügen, um nur das auszugeben, was übereinstimmt. Der Teil in Klammern gibt an, dass Sie alphanumerische Zeichen und Leerzeichen verwenden möchten.

Der Vorteil der Verwendung einer positiven Lookbehind-Klausel besteht darin, dass der Text "name =" nicht Teil der Übereinstimmung ist. Wenn grep übereinstimmenden Text hervorhebt, wird nur der alphanumerische (und Leerzeichen) Teil hervorgehoben. Der Parameter -o zeigt auch nicht den Teil "name =" an. Und wenn Sie dies in ein anderes Programm wie sed überführen, das den Text erfassen und etwas damit machen kann, werden Sie den "name =" Teil nicht erfassen, obwohl Sie das auch mit Capturing Parenthess tun können.

+2

unterstützt Grep eigentlich positiven Lookbehind? –

+1

Ich machte mir auch deswegen Sorgen, also habe ich es auf meinem Windows-PC ausprobiert, und deshalb musste ich den -P-Parameter verwenden. Es unterstützt es wahrscheinlich in den anderen Geschmacksrichtungen (vielleicht nicht -G), aber ich wusste nicht die richtige Flucht für die Elemente. Ich benutze Grep 2.5.1. – markets

+0

Ich bekomme das mit grep -P: grep: Unterstützung für die Option -P ist nicht in diese kompiliert Dies ist auf Ubuntu Hardy (Linux 2.6.24). Auf einem anderen Linux-Rechner fehlgeschlagen mit einer etwas anderen Fehlermeldung, und auch auf Solaris 10. –

1

grep druckt die gesamte Zeile, wo es mit dem Muster übereinstimmt. Um nur das übereinstimmende Muster zu drucken, verwenden Sie die Option grep -o. Sie werden wahrscheinlich auch sed verwenden müssen, um den Namen = Teil des Musters zu entfernen.

grep -o 'name=[0-9a-zA-Z ]' myfile | sed /^name=/d 
+4

Zwei Verfahren hierfür ist zu groß. Wenn Sie sed verwenden müssen, können Sie dies auch alleine tun. –

4

grep extrahiert nicht wie erwartet. Was Sie brauchen, ist

grep "name=" file.txt | cut -d'=' -f1- 
21

Try this:

sed -n 's/^name=//p' filename 

Erzählt wird sed nichts (-n) standardmäßig zu drucken, ersetzen Ihr Präfix mit nichts, und drucken, wenn die Substitution stattfindet.

Bonus: wenn Sie es wirklich brauchen nur mit nur Leerzeichen und alphanumerics Einträge übereinstimmen, können Sie das auch tun:

sed -n 's/^name=\([ 0-9a-zA-Z]*$\)/\1/p' filename 

Hier haben wir ein Muster hinzugefügt Räume und alphanumerics nur bis zum Ende entsprechen der Zeile ($), und wenn wir übereinstimmen, ersetzen wir die Gruppe in Klammern und drucken.

+0

+1. Einfach, elegant, performant. –

+1

Höchstwahrscheinlich eine sehr geeignete Lösung, aber der Fragesteller fragte nach Grep ... und es passt nicht nur Leerzeichen und alphanumerische Zeichen. – markets

+1

Übereinstimmungen nur Leerzeichen und Alphas ist trivial, ich füge etwas dafür hinzu. Wie nur für die Verwendung von Grep, naja, die oberste Antwort verwendet jetzt grep AND sed ... zumindest verwendet dies nur einen einzigen Prozess. :) –

3

gaffen

echo "name=some value here" | awk -F"=" '/name=/ { print $2}' 

oder mit bash

str="name=some value here" 
IFS="=" 
set -- $str 
echo $1  
unset IFS 

oder

str="name=some value here" 
str=${str/name=/}