it-swarm.com.de

Extrahieren Sie die Zeile, die mit einem bestimmten Muster in sed beginnt

Meine Eingabedatei sieht folgendermaßen aus:

IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

Ich verwende sed, um alle IDno und den Typ nur zu extrahieren, wenn der Typ Student ist.

sed -e '/IDno=/b' -e '/Type=Student/b' d

Das bringt mir alle Zeilen mit Typ student aber nicht die IDnos.

Ich möchte bekommen

IDno="1"
Type=Student
IDno="2"

aber ich bekomme

Type=Student

Was mache ich falsch?

3
user110327

egrep kann mehrere Zeilen aus einer Datei abrufen. Mit einer Pipe | als Trennzeichen können Sie so viele verschiedene Kriterien ziehen, wie Sie möchten. egrep entspricht grep -E. egrep ist ein Skript, das sich im Ordner /bin befindet und dessen Inhalt auf exec grep -E "[email protected]" zeigt.

Beispiel:

egrep "IDno=|Type=Student" inputfile

oder

grep -E "IDno=|Type=Student" inputfile

Sollte ausgeben:

IDno="1"
Type=Student
IDno="2"

Hoffe das hilft!

4
Terrance

Mit sed ist es einfacher, bestimmte Zeilen mit der Option -n und dem Befehl p zu drucken:

sed -rn '/IDno=|Type=Student/p'

Oder:

sed -n -e '/IDno=/p' -e '/Type=Student/p'

Die Option -n unterdrückt die Ausgabe, sofern sie nicht ausdrücklich gedruckt wird. Der Befehl p druckt natürlich übereinstimmende Zeilen.

4
muru
  • awk:

    Festlegen des Feldtrennzeichens als = und Drucken der Datensätze, die Type=Student als gesamten Datensatz oder IDno als erstes Feld enthalten:

    awk -F= '$1=="IDno" || $0=="Type=Student"'
    
  • Perl:

    Drucken der Zeilen, die mit IDno gefolgt von = beginnen oder mit Type beginnen, gefolgt von einem = und mit Student enden:

    Perl -ne 'print if /^(IDno=|Type=Student$)/'
    

Beispiel:

% cat file.txt                                  
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher

% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"

% Perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
3
heemayl

Die ursprüngliche Frage scheint zu fragen "alle IDno und den Typ zu extrahieren nur wenn Typ Student ist." Aber das Beispiel Ausgabe gibt alle IDno = Zeilen zurück, das ist also ziemlich widersprüchlich ...

Hier ist eine Antwort, die nur die IDnos und Typen zurückgibt, wenn Type = Student.

sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="

Eine kleine Erklärung:

  • -n, --quiet, --silent unterdrückt das automatische Drucken des Musterbereichs
  • N;N; Die nächste Eingabezeile in den Musterbereich einlesen/anhängen. (zweimal)
  • /IDno=.*Type=Student/p finde und drucke von IDno = bis Type = Student
  • | grep -v "^Name=" zeigt die Zeile Name = nicht an

Ich mag sed | grep nicht, aber ich bin mir nicht sicher, wie ich sed finde, um die Ausgabe zu durchsuchen, und eine Pipe sagt im Allgemeinen "Diese Ausgabe nehmen und etwas tun" ... Könnte grep | sed auch tun

grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'
0
Xen2050