weniger mit der Option -F und Mustervergleich

weniger mit der Option -F und Mustervergleich

Ich möchte eine Datei über ein Skript aufrufen lessund die Ausgabe auf der Konsole und nicht auf einem neuen Bildschirm drucken lassen. Wenn die Datei kurz genug ist, um auf einen Bildschirm zu passen, möchte ich das Scrollen deaktivieren. Wenn sie länger als ein Bildschirm ist, möchte ich darin scrollen können, aber sobald ich das Ende erreicht habe, möchte ich die lessKontrolle an die Konsole zurückgeben. Zeilen sollten ebenfalls abgeschnitten werden (in diesem Fall ist es in Ordnung, das Ende der Zeichenfolgen nach dem Konsolenfenster zu verlieren).

Ich möchte auch, dass ein bestimmtes Muster hervorgehoben wird.

Folgendes verwende ich als Argumente:

less -SFXE -p "ccc" fileToShow.txt

Ich verwende es -S, um lange Zeilen abzuschneiden, -FXum festzustellen, ob die Datei weniger Zeilen als die Konsole hat, und um den gesamten Text ohne Scrollen auf der Konsole auszugeben, und -Eum zu beenden, lesswenn ich das Ende der Datei erreicht habe, für die Fälle, in denen der Text länger als die Konsole ist und ich scrollen muss.

Diese funktionieren gut, bis ich den -pSchalter zum Hervorheben von Übereinstimmungen hinzufüge.

Angenommen, fileToShow.txt enthält Folgendes:

aaa
bbb
ccc
ddd
eee

Ohne den Musterschalter erhalte ich Folgendes:

[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $ 

Wenn ich die Musterübereinstimmung hinzufüge, druckt Less die leeren Zeilen bis zur Konsolenhöhe aus (wobei Tilden zum Anzeigen der leeren Zeilen verwendet werden).

[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $ 

Gibt es eine Möglichkeit, den -pSchalter zu verwenden, ohne dass bei der Verwendung diese leeren Zeilen angezeigt werden -F? (Hinweis: Die Zeile „ccc“ wird wie gewünscht hervorgehoben, bei mir tritt lediglich dieser unbeabsichtigte Nebeneffekt auf.)

Meine Shell ist bash 3.2.25und meine Less-Version ist 436. Betriebssystem ist RHEL.

Antwort1

Der folgende Befehl könnte in eine Batchdatei gekapselt werden:

 grep --color=always -E "^|$2" "$1"|less -SFXER

Der Parameter $1ist der Dateiname und $2das Suchmuster. Zu beachtende Punkte:

  • grep -E(oder egrep) ermöglicht die Übereinstimmung mit mehr als einem Suchmuster;
  • Durch Abgleich mit ^(Zeilenanfang) wird sichergestellt, dass jede Zeile aufgelistet wird.
  • bei Übereinstimmung $2wird der Suchbegriff hervorgehoben;
  • grep --color=alwayskopiert die Hervorhebungs-Escapesequenzen in die Pipe;
  • less -Rbewirkt, dass lessdie Hervorhebung reproduziert wird, anstatt die Escape-Sequenz anzuzeigen.

Dies ist zwar nicht die sauberste Lösung, aber immerhin eine Antwort. Beachten Sie, dass der Befehl alle Zeilen auflistet und das Muster hervorhebt, während less -per Zeilen vor der ersten Übereinstimmung auslässt: Um dies zu reproduzieren, müssten Sie verwenden sed.

Antwort2

Es gibt einen anderen Weg, All-in less. Allerdings sind dafür mehrere Schritte erforderlich.

  1. less fileToShow.txt
  2. Treffer &ccc(vorausgesetzt, ccces handelt sich um das gesuchte Muster). Aus der Manpage:

    &pattern: Display only lines which match the pattern; lines which do not match the pattern are not displayed. If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed. While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden. Certain characters are special as in the / command: ^N or ! Display only lines which do NOT match the pattern. ^R Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

  3. Zum Schluss drücken, Fum die Verfolgung fortzusetzen

Antwort3

Keine vollständige Lösung, aber einige Verbesserungen gegenüber -p...
Diese basieren auf der flexiblen +Flagge:

Wenn eine Befehlszeilenoption mit beginnt +, wird der Rest dieser Option als erster Befehl angesehen, umweniger. Zum Beispiel +G erzählt weniger am Ende der Datei statt am Anfang zu beginnen und +/xyzweist an, beim ersten Vorkommen von „xyz“ in der Datei zu beginnen. Als Sonderfall +<number>verhält sich wie +<number>g; das heißt, es beginnt die Anzeige bei der angegebenen Zeilennummer (siehe jedoch den Vorbehalt unter dem Befehl „g“ oben). Wenn die Option mit beginnt ++, gilt der Anfangsbefehl für jede angezeigte Datei, nicht nur für die erste. Der + zuvor beschriebene Befehl kann auch verwendet werden, um einen Anfangsbefehl für jede Datei festzulegen (oder zu ändern).

-pspringt zur ersten Übereinstimmung (oder ein paar Zeilen davor, wenn Sie verwenden --jump-target). Das ist nicht das, was ich in Kombination mit dem Beenden bei „short“ haben möchte – die übersprungenen Zeilen sind nicht einmal das Scrollback des Terminals!

  1. Wenn Sie lessdann interaktiv suchen /ccc, zeigt less zuerst die Zeilen vom Anfang an und scrollt erst dann, so dass siewürdewird Teil des Scrollback-Puffers des Terminals. Wir können das emulieren, +müssen aber explizit ein Neuzeichnen anfordern mit r:

    env LESS= less -SFXE +r/ccc fileToShow.txt
    

    Dies scrollt immer noch zur cccZeile, aber jetzt sind aaasie bbbzumindest im Scrollback-Puffer. Wenn die Suche jedoch viele Zeilen überspringt:

    seq 1000 | less -SFXE +r/980
    

    beim Zurückscrollen wird etwa Folgendes angezeigt:

     48
     49
     50
     ...skipping...
     980
     981
     982
    

    Ich hatte erwartet, dass dies über einstellbar ist --max-back-scroll, aber es scheint die Suche nicht zu beeinflussen. BEARBEITEN: Es scheint von der Fenstergröße abzuhängen, d. h. es füllt einen Bildschirm und überspringt dann.

  2. Wer sagt, dass ich die ersten Zeilen nicht sehen möchte? Wenn ich nur Übereinstimmungen hervorheben möchte, könnte ich den Trick mit leeren Übereinstimmungen verwenden:

     less -SFXE '+r/ccc|$' fileToShow.txt
    

    Dies unterbricht jedoch die Navigation mit n/ N. Es ist besser, dieses Flag bei der Suche zu verwenden /:

    Bestimmte Zeichen haben eine besondere Bedeutung, wenn sie am Anfang des Musters eingegeben werden. Sie ändern die Art der Suche, anstatt Teil des Musters zu werden:
    ...

    • ^K Markieren Sie jeden Text, der dem Muster auf dem aktuellen Bildschirm entspricht, aber gehen Sie nicht zur ersten Übereinstimmung (AKTUELLE POSITION BEIBEHALTEN).

    Die Syntax zum Einbinden von Ctrl+KZeichen hängt von der Shell ab. In Bash funktioniert dies:

     less -SFXE $'+r/\cKccc' fileToShow.txt
    

    So oder so, ab der ersten Zeile reduziert sich auch die Anzahl der ~Füllungen des Bildschirms

verwandte Informationen