So scrollen Sie durch eine große Datendatei, während der Header erhalten bleibt


19

Angenommen, ich habe eine große Datendatei, die den Bildschirm sowohl in vertikaler als auch in horizontaler Richtung überläuft. Wie kann ich diese Datei durchsuchen, während die Kopfzeilen auf dem Bildschirm bleiben?

Im Moment benutze ich less -S, damit ich meine Datei horizontal und vertikal schön scrollen kann. Beim Scrollen nach unten verschwinden die Kopfzeilen jedoch offensichtlich. Gibt es eine Möglichkeit, diese mit weniger zu halten?

Eine Alternative ist die Verwendung vimim Split-Screen-Modus mit :set nowrap. Wenn ich jetzt horizontal scrolle, scrollt das obere Fenster jedoch nicht auf die gleiche Weise ( :windo set scrollbindfunktioniert meines Wissens nur für vertikales Scrollen).


Was meinst du mit Header bleibt sichtbar, während die Daten weiter rollen? Meinen Sie damit, dass Sie nur die erste Zeile mit den Spaltennamen beibehalten möchten? Gibt es nur eine Datei mit Daten und ändern sich diese Daten ständig und Sie möchten daher nur die geänderten Zeilen sehen? Möchten Sie nur die ersten N Zeilen oder die letzten N Zeilen sehen?
Polym

2
@polym: lessoder tail -fdas verhält sich genauso wie sonst, nur dass die erste auf dem Bildschirm angezeigte Zeile immer die Kopfzeile ist. Wie Websites (oder Excel) mit einer festen Kopfzeile, aber einem Bildlaufkörper.
Mat

@polym ^ was auch immer er sagte!
Debanjan Basu

@polym, Überlegen Sie, wie Sie eine horizontale und vertikale Ansicht in einer Tabelle einfrieren können. Eingefrorene Spalten bleiben beim Scrollen an Ort und Stelle.
user208145

Antworten:


11

Wenn Sie mit vim vertraut sind, ist dies wahrscheinlich die beste Option für Sie. Sie können die horizontale Bildlaufbindung aktivieren, indem Sie Folgendes ändern 'scrollopt':

set scrollopt=hor

Mit erhalten vim -u NONESie das gewünschte Verhalten mit:

:set scrollopt=hor
:set nowrap
:1split
:windo set scrollbind

Möglicherweise möchten Sie anpassen 'sidescroll'und 'sidescrolloff'ändern, wie viele Spalten übersprungen werden und wie weit das Überspringen von Kanten jeweils beginnt.


1
Gibt es eine Möglichkeit, dies mit weniger zu tun? Vor allem, wenn Sie durch riesige Datendateien scrollen (zu groß, um sie in den Speicher zu laden)?
NM

@NM: Siehe die anderen Antworten
Thor

Ich habe es versucht und wenn ich im unteren Fenster nach unten
scrolle,

@DanielSerodio: Irgendetwas scheint sich geändert zu haben. Es funktioniert, wenn Sie scrollopt auf einstellen hor, siehe die aktualisierte Antwort
Thor

Die aktualisierte Antwort funktioniert wie erwartet, danke für die blitzschnelle Antwort :)
Daniel Serodio

17

Auf Terminals, die das Einstellen des Bildlaufbereichs unterstützen:

tailf() ( # args: <file> [<number-of-header-lines>]
  trap 'tput csr 0 "$((LINES-1))"' INT
  tput csr "$((1+${2-1}))" "$((LINES-1))"
  tput clear
  {
    head -n"${2-1}"
    printf "%${COLUMNS}s\n" "" | tr ' ' =
    tail -n "$((LINES-1-${2-1}))" -f
  } < "$1"
)

(setzt eine Shell wie zshoder voraus bash, die die Variablen $COLUMNSund $LINESbasierend auf der Größe des Terminals festlegt ).


1
Kumpel! Das ist göttlich! Entschuldigung, konnte mich nicht kontrollieren. Können Sie mich zu Webseiten oder Befehlen oder Variablen weiterleiten, um die folgenden Funktionen zu implementieren?
Debanjan Basu

1. Beenden Sie mit q 2. updown
Scrollen Sie

ist es möglich , auf huckepack lessselbst ohne Verwendung headund tailden Bildschirm jedes Mal neu zu zeichnen? Ich bin übrigens immer noch <3 Ihre Lösung. Ich markiere es noch nicht richtig, weil Sie es zu bearbeiten scheinen und ich möchte nicht, dass Sie selbstgefällig werden. Selbstzufriedenheit ist ein Kreativitätskiller, wurde mir gesagt! :)
Debanjan Basu

@DebanjanBasu können Sie less -Xanstelle von tail -n ...oben verwenden, aber die "Auf" -Taste löscht den Header dort.
Stéphane Chazelas

Wie ich schon sagte, wenn Sie bessere Ideen haben, zeigen Sie mir das einfach, oder noch besser, passen Sie Ihre Antwort weiter an. Ich musste es richtig markieren, weil Sie die Frage beantwortet haben , die ich ursprünglich gestellt habe. Die Idee ist, eine lessUmgebung zwischen einer Kopfzeile und einer Fußzeile zu haben, um sie zu einem allgemeineren Werkzeug zu machen.
Debanjan Basu

6

Versuchen Sie dies (Sie müssen es installieren multitail):

multitail -du -t "$(head -n 1 filename)" filename

oder für Überschriften, die länger als eine Zeile sind:

multitail -wh 2 -l "head -n 2 filename" filename

Wenn Sie die Befehlsausgabe anstelle einer Datei verfolgen möchten:

multitail -wh 2 -l "command | head -n 2" -l command

oder -tentsprechend verwenden. Beachten Sie, dass Sie möglicherweise verwenden müssen, unbufferdamit Ihre Befehlsausgabe sofort angezeigt wird.

Mit können Sie -Ddie Anzeige von Statuszeilen für die -whFormulare deaktivieren (dies würde den Zweck des -tFormulars beeinträchtigen).


2

In Thors Antwort wurde nicht erwähnt, dass das vertikale "Scrollopt" deaktiviert wurde, wodurch beide Fenster vertikal gescrollt werden. Für mich ist die vollständige Lösung das Einfügen in vim:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind

Sie können scrolloptdirekt mit :scrollopt=horoder einstellen :scrollopt=hor,jump, je nach Ihren Vorlieben. Hier ist der VimDoc für scrollopt.
Michael

1

Das ist so weit wie ich gekommen bin mit tmux:

#!/bin/bash

tmux new-session -s main -n 'w1' -d
tmux send-keys -t main:w1.0 "tail -f <(head -n1 $1)" C-j
tmux split-window -v
tmux resize-pane -t 0 -y 2
tmux send-keys -t 1 "tail -n+2 $1|less -S" C-j
tmux attach -t main

Es ist eine Erweiterung der Antwort von user80519 zum tmuxTeilen von Fenstern. Speichern unter hless.sh, ausführbar machen und wie verwenden

hless.sh file
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.