it-swarm.com.de

Sed : druckt alle Zeilen nach dem Match

Ich habe mein Forschungsergebnis nach der Verwendung von sed erhalten:

zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | cut -f 1 - | grep "pattern"

Aber es zeigt nur den Teil, den ich geschnitten habe. Wie kann ich nach einer Übereinstimmung alle Zeilen drucken?

Ich verwende zcat, daher kann ich awk nicht verwenden.

Vielen Dank.

Bearbeitet:

Dies ist meine Logdatei:

[01/09/2015 00:00:47]       INFO=54646486432154646 from=steve   idfrom=55516654455457       to=jone       idto=5552045646464 guid=100021623456461451463   n
um=6    text=hi my number is 0 811 22 1/12   status=new      survstatus=new

Mein Ziel ist es, alle Benutzer zu finden, die meine Website mit ihren Telefonnummern (unter Verwendung von grep "pattern") spammen, und dann alle Zeilen auszudrucken, um alle Informationen zu jedem Spam zu erhalten. Das Problem ist, dass es möglicherweise Übereinstimmungen in INFO oder id gibt. Daher verwende ich sed, um den Text zuerst abzurufen.

5
brest1007

Vielleicht ist es das, was du eigentlich willst? Finde Zeilen, die mit "pattern" übereinstimmen und extrahiere das Feld nach text= bis kurz vor status=?

zcat file* | sed -e '/pattern/s/.*text=\(.*\)status=[^/]*/\1/'

Sie verraten nicht, was pattern tatsächlich ist - wenn es sich um eine Variable handelt, können Sie sie nicht in einfache Anführungszeichen setzen.

Beachten Sie, dass in Ihrem Beispiel \(.*\)status=[^/]* durch survstatus=new übereinstimmt. Das ist wahrscheinlich nicht was du willst? Es scheint nirgendwo einen status= gefolgt von einem Schrägstrich zu geben - Sie sollten wirklich detaillierter erklären, was Sie tatsächlich erreichen möchten.

Ihr Fragentitel lautet "Alle Zeilen nach einer Übereinstimmung", also möchten Sie vielleicht alles nach text=? Dann ist das einfach

sed 's/.*text=//'

d.h. durch text= mit nichts ersetzen und den Rest behalten. (Ich vertraue darauf, dass Sie herausfinden können, wie Sie das umgebende Skript in zcat file* | sed '/pattern/s/.*text=//' ändern können. Hoppla, vielleicht ist mein Vertrauen gescheitert.)

4
tripleee

Alle Zeilen nach einer Übereinstimmung in sed drucken:

$ sed -ne '/pattern/,$ p'
  # alternatively, if you don't want to print the match:
$ sed -e '1,/pattern/ d'

Das Filtern von Zeilen, wenn Musterübereinstimmungen zwischen "text =" und "status =" vorliegen, kann mit einer einfachen grep durchgeführt werden, wobei sed und cut nicht erforderlich sind:

$ grep 'text=.*pattern.* status='
21
JB.

alternativ kannst du awk verwenden

awk '/pattern/,EOF'

kann sich vielleicht auch mit allen vorherigen Operationen in awk kombinieren.

4
karakfa

Der selten verwendete Verzweigungsbefehl erledigt dies für Sie. Verwenden Sie n, bis Sie eine Übereinstimmung gefunden haben, und verzweigen Sie dann zum Anfang. Verwenden Sie nach dem Abgleich n, um die entsprechende Zeile zu überspringen, und kopieren Sie dann die verbleibenden Zeilen in einer Schleife.

cat file | sed -n -e ':start; /pattern/b match;n; b start; :match n; :copy; p; n ; b copy'
3
user2398449
zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | ***cut -f 1 - | grep "pattern"***

Ändern Sie stattdessen die letzten beiden Segmente Ihrer Pipeline so, dass:

zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | **awk '$1 ~ "pattern" {print $0}'**
0
Elbert Hannah