Ich brauche Hilfe mit Grep, um an einem Abschnitt zu beginnen

8

Ich habe einige Textdateien, von denen ich einen Codeabschnitt bearbeiten möchte. Das Ziel, das ich zu erreichen versuche, ist es, den Blick auf eine bestimmte Linie & amp; dann kannst du etwas darunter lesen. Beispielsweise. Wie betrachte ich die Textdatei am Anfangspunkt von gelb im Text unten? Ich möchte den Inhalt von "gelb" sowie alles darunter anzeigen, unabhängig davon, was dieser Inhalt ist.

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
    
john smith 30.01.2016, 22:06

5 Antworten

9

AWK Verwenden Sie AWK - das ist das Einfachste, was es bekommen kann:

awk '/yellow/,0' textfile.txt

Beispiellauf

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

Grep

Sie können auch die Option grep mit --after-context verwenden, um bestimmte Zeilen nach der Übereinstimmung zu drucken

grep 'yellow' --after-context=999999  textfile.txt

Für die automatische Kontexteinstellung können Sie $(wc -l textfile.txt) verwenden. Die Grundidee ist, dass Sie, wenn Sie eine erste Zeile als Übereinstimmung haben und alles nach dieser Übereinstimmung drucken möchten, die Anzahl der Zeilen in der Datei minus 1 kennen müssen. Glücklicherweise wird --after-context keine Fehler verursachen die Anzahl der Zeilen, so dass Sie die Nummer ganz außerhalb des Bereichs angeben könnten, aber falls Sie es nicht wissen, wird die Gesamtzahl der Zeilen

sein
$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

Wenn Sie den Befehl --after-context auf die gleiche Option wie -A und $(wc -l textfile.txt) verkürzen möchten, wird die Anzahl der Zeilen um den Dateinamen erweitert. Also gibst du textfile.txt nur einmal

ein
grep "yellow" -A $(wc -l textfile.txt)

Python

[email protected]:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
[email protected]:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

Oder alternativ ohne printable flag

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()
    
Sergiy Kolodyazhnyy 30.01.2016, 22:10
5

Sie können es tun, indem Sie:

awk '/yellow/{f=1}f' file

Dabei ist "Datei" der Dateiname, der Ihren Text enthält.

    
Pilot6 30.01.2016 22:09
5

Nicht grep , aber mit sed :

sed -n '/^yellow$/,$p' file
  • -n : verhindert das Drucken
  • /^yellow$/,$ : Adressbereich, der vom ersten Auftreten einer Zeile mit genauem yellow bis zur letzten Zeile einschließlich
  • reicht
  • p : druckt die Zeilen im Adressbereich
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough
    
kos 30.01.2016 22:49
5

Spät zur Party:)

Verwenden von grep :

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P ermöglicht uns die Verwendung von Perl-kompatiblen Regex

  • -z bewirkt, dass die Eingabedatei durch ASCII NUL getrennt wird, und zwar durch die neue Zeile

  • -o nimmt nur den gewünschten Teil

  • (?s) ist der Modifikator DOTALL, ermöglicht es uns, newline mit dem Token . (beliebiges Zeichen)

  • zu verknüpfen
  • In \n\K , \n entspricht einer neuen Zeile, \K verwirft die Übereinstimmung

  • yellow\n.* stimmt mit yellow überein, gefolgt von einem Zeilenumbruch und alles danach wird ebenfalls ausgewählt und in der Ausgabe angezeigt.

Beispiel:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

Mit wenig python :

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines ist die Liste, die alle Zeilen der Datei enthält (auch mit abschließenden Zeilenumbrüchen)

  • lines.index('yellow\n') gibt uns den niedrigsten Index von lines , wobei yellow\n gefunden wird

  • lines[lines.index('yellow\n'):] verwendet Listen-Slicing, um den Teil von yellow\n bis Ende

  • zu erhalten
  • join verbindet die Elemente der Liste zur Ausgabe als String

heemayl 31.01.2016 03:17
4

Da sich die Frage auf Betrachten der Datei bezieht, gibt es immer das gute alte

less +/yellow file
    
steeldriver 31.01.2016 15:31