grep 'potato:' file.txt | sed 's/^.*: //'
grep
sucht nach einer Zeile, die die Zeichenfolge enthält potato:
, und sed
ersetzt ( s///
- ersetzt) für jede dieser Zeilen jedes Zeichen ( .*
) vom Zeilenanfang ( ^
) bis zum letzten Auftreten der Sequenz :
(Doppelpunkt gefolgt von Leerzeichen) durch das Leerzeichen Zeichenfolge ( s/...//
- Ersetzen Sie den ersten Teil durch den zweiten Teil, der leer ist).
oder
grep 'potato:' file.txt | cut -d\ -f2
Teilen Sie für jede Zeile, die enthält potato:
, cut
die Zeile in mehrere durch Leerzeichen begrenzte Felder auf ( -d\
- d
= Trennzeichen, \
= Leerzeichen, so etwas -d" "
hätte auch funktioniert) und drucken Sie das zweite Feld jeder solchen Zeile aus ( -f2
).
oder
grep 'potato:' file.txt | awk '{print $2}'
Gibt für jede Zeile, die enthält potato:
, awk
das zweite Feld ( print $2
) aus, das standardmäßig durch Leerzeichen getrennt ist.
oder
grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'
Alle darin enthaltenen Zeilen potato:
werden an ein inline ( -e
) - Perl- Skript gesendet, aus dem alle Zeilen stammen stdin
. Anschließend wird für jede dieser Zeilen dieselbe Ersetzung wie im ersten Beispiel oben durchgeführt und anschließend gedruckt.
oder
awk '{if(/potato:/) print $2}' < file.txt
Die Datei wird über stdin
( < file.txt
sendet den Inhalt der Datei über stdin
den Befehl auf der linken Seite) an ein awk
Skript gesendet , das für jede Zeile, die enthält potato:
( if(/potato:/)
gibt true zurück, wenn der reguläre Ausdruck /potato:/
mit der aktuellen Zeile übereinstimmt), das zweite Feld wie beschrieben druckt über.
oder
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
Die Datei wird über stdin
( < file.txt
siehe oben) an ein Perl-Skript gesendet , das ähnlich wie oben funktioniert. Diesmal wird jedoch auch sichergestellt, dass jede Zeile die Zeichenfolge enthält potato:
( /potato:/
ein regulärer Ausdruck, der übereinstimmt, wenn die aktuelle Zeile enthält potato:
, und wenn es tut ( &&
), wendet dann den oben beschriebenen regulären Ausdruck an und druckt das Ergebnis).
awk '$1 ~ /potato/ { print $2 }' file.txt
.awk '/potato:/ {print $2}'
perl -pe
Oder verwenden Sie Regex-Behauptungen:
grep -oP '(?<=potato: ).*' file.txt
quelle
-o
bedeutet, dass nur der passende Teil der Zeile gedruckt wird. Während-P
ein Perl-kompatibler regulärer Ausdruck folgt , der zufällig ein positiver Look hinter Regex ist(?<=string)
.Man kann sich Grep als eingeschränkten Sed oder Sed als generalisierten Grep vorstellen. In diesem Fall ist Sed ein gutes, leichtes Werkzeug, das macht, was Sie wollen - obwohl es natürlich auch mehrere andere vernünftige Möglichkeiten gibt, dies zu tun.
quelle
Dies druckt alles nach jedem Spiel nur in derselben Zeile:
Dies wird dasselbe tun, außer dass auch alle nachfolgenden Zeilen gedruckt werden:
Diese Befehlszeilenoptionen werden verwendet:
-n
Schleife um jede Zeile der Eingabedatei-l
Entfernt Zeilenumbrüche vor der Verarbeitung und fügt sie anschließend wieder hinzu-e
Führen Sie den Perl-Code ausquelle
-P
Perl regulären Ausdruck verwenden-o
um nur die Übereinstimmung auszugeben\s
um den Raum danach anzupassenpotato:
\K
das Match weglassen.*
um mit dem Rest der Zeichenfolge (n) übereinzustimmenquelle
Sie können grep verwenden, wie in den anderen Antworten angegeben. Sie benötigen jedoch kein grep, awk, sed, perl, cut oder externes Werkzeug. Sie können es mit purer Bash tun.
Versuchen Sie dies (Semikolons sind vorhanden, damit Sie alles in eine Zeile setzen können):
## weist bash an, die längste Übereinstimmung von ":" in $ line von vorne zu löschen.
oder wenn Sie den Schlüssel anstelle des Werts möchten, weist %% bash an, die längste Übereinstimmung von ":" in der $ -Zeile am Ende zu löschen.
Der Teilstring, auf den aufgeteilt werden soll, lautet ": \", da das Leerzeichen mit dem Backslash maskiert werden muss.
Weitere Informationen finden Sie im Linux-Dokumentationsprojekt .
quelle
while read
ist extrem langsam; Die Verwendung eines externen Dienstprogramms ist tatsächlich viel schneller, solange Sie eines mit gepufferten E / A auswählen (dh praktisch eines der in dieser Antwort genannten und viele andere).read -r
es auch verwenden, es sei denn, Sie benötigen speziell ein ziemlich lästiges Legacy-Verhalten vor POSIX.Modern BASH unterstützt reguläre Ausdrücke:
while read -r line; do if [[ $line =~ ^potato:\ ([0-9]+) ]]; then echo "${BASH_REMATCH[1]}" fi done
quelle