Wie benutzt man grep, um etwas direkt nach `name =` zu bekommen?


74

Ich versuche nicht, irgendetwas gleich danach zu erfassen name=, sondern nur Leerzeichen und alphanumerische Zeichen.

z.B:

name=some value here

Ich bekomme

some value here

Ich bin total neu in diesem Bereich, der folgende Grep passt zu allem, einschließlich dem name=.

grep 'name=.*' filename

Jede Hilfe wird sehr geschätzt.


echo 'name=some value here' | grep -Po 'name=\K[ A-Za-z0-9]*'
LF00

Antworten:


125

Wie hier beschrieben , möchten Sie eine positive Lookbehind-Klausel, wie z.

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

Das -P lässt grep den Perl-Dialekt verwenden, andernfalls müssten Sie wahrscheinlich die Klammern verlassen. Sie können den -oParameter auch an anderer Stelle anhängen , um nur das auszudrucken, was übereinstimmt. Der Teil in Klammern gibt an, dass Sie alphanumerische Zeichen und Leerzeichen 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 Teil (und Leerzeichen) hervorgehoben. Der Parameter -o zeigt auch nicht den Teil "name =" an. Und wenn Sie dies auf ein anderes Programm wie sed umstellen, das möglicherweise den Text erfasst und etwas damit macht, wird der Teil "name =" nicht erfasst, obwohl Sie dies auch mithilfe der Erfassung von parenthess tun können.


2
unterstützt grep tatsächlich positives Aussehen?
Charles Ma

1
Ich war auch darüber besorgt, also habe ich es auf meinem Windows-PC versucht, und deshalb musste ich den Parameter -P verwenden. Es unterstützt es wahrscheinlich in den anderen Geschmacksrichtungen (vielleicht nicht -G), aber ich wusste nicht, wie die Elemente richtig entkommen können. Ich benutze grep 2.5.1.
Märkte

Ich bekomme dies mit grep -P: grep: Die Unterstützung für die Option -P ist nicht in diese kompiliert. Dies ist unter Ubuntu Hardy (Linux 2.6.24). Auf einem anderen Linux-Computer schlug dies mit einer etwas anderen Fehlermeldung fehl, ebenso auf Solaris 10.
John Zwinck

1
@MatthieuRiegler Funktioniert, wenn Sie gnu grep installieren, dh Brew install grep - Standardnamen
John Morales

1
Normalerweise bevorzuge ich das weniger umständliche \KMuster, da es für mich leichter zu lesen ist, z grep -oP 'name=\K[ A-Za-z0-9]*' filename. Außerdem beanspruchen die Perl-Dokumente einen Leistungsvorteil mit \K.
Ich bin

27

Versuche dies:

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

Es weist sed an, standardmäßig nichts (-n) zu drucken, Ihr Präfix durch nichts zu ersetzen und zu drucken, wenn die Ersetzung erfolgt.

Bonus: Wenn Sie es wirklich brauchen, um nur Einträge mit Leerzeichen und alphanumerischen Zeichen abzugleichen, können Sie dies auch tun:

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

Hier haben wir ein Muster hinzugefügt, um Leerzeichen und alphanumerische Zeichen nur bis zum Ende der Zeile ($) abzugleichen. Wenn wir übereinstimmen, ersetzen wir die Gruppe in Klammern und drucken.


1
Höchstwahrscheinlich eine sehr geeignete Lösung, aber der Fragesteller fragte nach grep ... und es stimmt nicht nur mit Leerzeichen und alphanumerischen Zeichen überein.
Märkte

2
Es ist trivial, nur Leerzeichen und Alphas zu finden. Dafür werde ich etwas hinzufügen. Was die Verwendung von grep betrifft, so verwendet die Antwort mit dem höchsten Rang derzeit grep AND sed ... zumindest wird nur ein einziger Prozess verwendet. :)
John Zwinck

Ich liebe auch deine Antwort, da ich mich sedjetzt auch damit beschäftige. Danke für deine Tipps!
Ngaame

7

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=/}

7

grep extrahiert nicht wie erwartet. Was Sie brauchen ist

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

1

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

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

5
Zwei Prozesse hierfür sind übertrieben. Wenn Sie sed verwenden müssen, können Sie dies auch alleine tun.
John Zwinck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.