
Ich möchte eine Datei über ein Skript aufrufen less
und 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 less
Kontrolle 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, -FX
um festzustellen, ob die Datei weniger Zeilen als die Konsole hat, und um den gesamten Text ohne Scrollen auf der Konsole auszugeben, und -E
um zu beenden, less
wenn 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 -p
Schalter 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 -p
Schalter 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.25
und 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 $1
ist der Dateiname und $2
das Suchmuster. Zu beachtende Punkte:
grep -E
(oderegrep
) ermöglicht die Übereinstimmung mit mehr als einem Suchmuster;- Durch Abgleich mit
^
(Zeilenanfang) wird sichergestellt, dass jede Zeile aufgelistet wird. - bei Übereinstimmung
$2
wird der Suchbegriff hervorgehoben; grep --color=always
kopiert die Hervorhebungs-Escapesequenzen in die Pipe;less -R
bewirkt, dassless
die 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 -p
er 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.
less fileToShow.txt
- Treffer
&ccc
(vorausgesetzt,ccc
es 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.
- 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+/xyz
weist 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).
-p
springt 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!
Wenn Sie
less
dann 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 mitr
:env LESS= less -SFXE +r/ccc fileToShow.txt
Dies scrollt immer noch zur
ccc
Zeile, aber jetzt sindaaa
siebbb
zumindest 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.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