GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie suche ich nach Inhalten nach dem Muster?

sed -n 's/^potato:[[:space:]]*//p' file.txt

Man kann sich Grep als eingeschränktes Sed oder Sed als verallgemeinertes Grep vorstellen. In diesem Fall ist Sed ein gutes, leichtgewichtiges Werkzeug, das tut, was Sie wollen – obwohl es natürlich auch mehrere andere vernünftige Möglichkeiten gibt, dies zu tun.


grep -Po 'potato:\s\K.*' file

-P um einen regulären Perl-Ausdruck zu verwenden

-o um nur die Übereinstimmung auszugeben

\s um mit dem Leerzeichen nach potato: übereinzustimmen

\K um die Übereinstimmung wegzulassen

.* um den Rest der Zeichenfolge(n) abzugleichen


Oder verwenden Sie Regex-Zusicherungen:grep -oP '(?<=potato: ).*' file.txt


grep 'potato:' file.txt | sed 's/^.*: //'

grep sucht nach einer Zeile, die den String potato: enthält , dann für jede dieser Zeilen sed ersetzt (s/// - Ersatz) ein beliebiges Zeichen (.* ) vom Anfang der Zeile (^ ) bis zum letzten Auftreten der Sequenz : (Doppelpunkt gefolgt von Leerzeichen) durch die leere Zeichenfolge (s/...// - Ersetzen Sie den ersten Teil durch den zweiten Teil, der leer ist).

oder

grep 'potato:' file.txt | cut -d\   -f2

Für jede Zeile, die potato: enthält , cut teilt die Zeile in mehrere Felder auf, die durch Leerzeichen getrennt sind (-d\ - d =Trennzeichen, \ =maskiertes Leerzeichen, so etwas wie -d" " hätte auch funktioniert) und das zweite Feld jeder solchen Zeile ausgeben (-f2 ).

oder

grep 'potato:' file.txt | awk '{print $2}'

Für jede Zeile, die potato: enthält , awk druckt das zweite Feld (print $2 ), die standardmäßig durch Leerzeichen getrennt ist.

oder

grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'

Alle Zeilen, die potato: enthalten werden an eine Inline gesendet (-e ) Perl-Skript, das alle Zeilen von stdin übernimmt , führt dann für jede dieser Zeilen dieselbe Ersetzung wie im ersten obigen Beispiel durch und gibt sie dann aus.

oder

awk '{if(/potato:/) print $2}' < file.txt

Die Datei wird per stdin gesendet (< file.txt sendet den Inhalt der Datei über stdin zum Befehl auf der linken Seite) zu einem awk Skript, das für jede Zeile, die potato: enthält (if(/potato:/) gibt true zurück, wenn der reguläre Ausdruck /potato:/ entspricht der aktuellen Zeile), druckt das zweite Feld, wie oben beschrieben.

oder

perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt

Die Datei wird per stdin gesendet (< file.txt , siehe oben) zu einem Perl-Skript, das ähnlich wie das obige funktioniert, diesmal aber auch dafür sorgt, dass jede Zeile den String potato: enthält (/potato:/ ist ein regulärer Ausdruck, der passt, wenn die aktuelle Zeile potato: enthält , und falls ja (&& ), wendet dann den oben beschriebenen regulären Ausdruck an und gibt das Ergebnis aus).


Linux
  1. Wie stellt man Xfs-Daten nach Rm wieder her?

  2. Linux – Woher wissen Sie, wofür Sie in Dmesg grep müssen?

  3. Wie kann man sich nach Kate-Abstürzen erholen?

  4. Grep Wie unterdrücke ich die Anzeige einer nicht übereinstimmenden Datei?

  5. Wie man mit der Farbausgabe umgeht

So verwenden Sie CherryTree für Notizen

Wie man nach mehreren Zeichenfolgen, Mustern oder Wörtern sucht

So finden Sie eine Zeichenfolge in einer Datei unter Linux

So leiten Sie die Shell-Befehlsausgabe um

Wie kann man einen kontinuierlichen Stream „grep“?

Wie sehe ich du in GB anstelle von MB in Linux?