Pipe grep to less zeigt den grep-Befehl als Dateinamen

875
Mike Dannyboy

less -M zeigt den Dateinamen als Eingabeaufforderung an, wie in:

 1 asdf test.txt lines 1-1/1 (END) 

Ich mag es, grep in weniger zu pfeifen, um das Lesen zu erleichtern. Kann ich den Befehl grep als Dateinamen für die Eingabeaufforderung weniger interpretieren?

Normalerweise ist es nur:

grep asdf test.txt | less :

 1 asdf lines 1-1/1 (END) 

Ich würde gerne:

grep asdf test.txt | less :

 1 asdf grep asdf test.txt lines 1-1/1 (END) 

Ich weiß, ich könnte das alles in ein Skript packen und Dinge mit den $0Argumenten anstellen, aber nicht versuchen, das Rad hier neu zu erfinden.

Ist das mit nur ein paar Kommandozeilen-Tricks möglich?

1
"grep -H"? Ist es nicht irreführend, den Dateinamen trotzdem anzuzeigen, da dies nur die Ausgabe von grep ist ... Xen2050 vor 6 Jahren 0
Ich wollte, dass der "Dateiname", wie er von "less -M" interpretiert wird, der verwendete grep-Befehl ist. In meinem Beispiel war der Befehl "grep asdf text.txt", der als Dateiname in weniger angezeigt werden sollte, als eine einfache Erinnerung an das, wonach ich überhaupt gesucht habe. Mike Dannyboy vor 6 Jahren 0

2 Antworten auf die Frage

1
thrig

lesshat keinen Hinweis darauf, was sich auf der anderen Seite der Pipe befindet, über die Daten über die Standardeingabe zugeführt werden, es sei denn, jemand macht den Code für lessdas Auffinden der Prozessgruppe lessund anderer Prozesse in dieser Prozessgruppe und dann sehr kompliziert Wer weiß, wie diese zusammenpassen (die Shell kennt diese Informationen, kann sie jedoch nicht zur Verfügung stellen).

Durch das Lesen in less(1)einem kann die -POption zur Anpassung der Eingabeaufforderung gefunden werden

$ echo hi | less -P '?f%f:Standard input' hi Standard input 

Also in der Theorie, wenn wir das Standard inputBit durch die aktuelle Shell-Pipeline ersetzen können ... mal sehen, was setwann lessläuft ...

$ function less { set > whatisset; command less "$@"; } $ echo foo | less foo $ egrep 'echo|foo' whatisset $  

also nichts offensichtliches zu verwenden für mksh, als echooder foo(äquivalent zu Ihrem grep) erscheinen nirgendwo in der Shell-Umgebung (gleiche Story für zshund oh wow macht bashauf Linux jemals die Umgebung mit Einstellungen, aber wieder dieselbe Story). Eigentlich können zshwir mit einer preexecFunktion die Befehlszeile verfügbar machen:

$ zsh % function preexec { shift; SHORT=$1; } % function less { set > whatisset; command less "$@"; } % echo foo | less foo % grep SHORT whatisset SHORT='echo foo | less' %  

so könnte man sowas machen

% less() { =less -P '?f%f:'$ "$@"; } % echo hi|less hi echo hi 
Cool, danke. Es scheint also, dass das lange und kurze davon in zsh gemacht werden kann, aber nicht so einfach in bash. Da dachte ich einfach nichts. Vielen Dank für die ausführliche Antwort, immer toll, um neue Dinge zu lernen. Mike Dannyboy vor 6 Jahren 0
0
Mike Dannyboy

Ich ging gegen mich selbst und schrieb ein kleines Skript, das dies bewerkstelligt. Es ist nicht schön, aber es funktioniert und nicht schlecht, da es nur ein paar Zeilen sind. Immer für Verbesserungen bereit.

#!/bin/bash  # store all args as string allargs="$*"  # create temp file named as grep command TMPFILE=$(mktemp -q "$allargs")  # run grep command $* --color=always > "$TMPFILE" # --color=always with less -r will highlight results in less  # show results file in less less -Mr "$TMPFILE"  # delete the temp file rm -f -- "$TMPFILE" 

Ausführen als ./scriptname grep <opts> <regex> <file(s)>.

Nachteil: Wenn fileist *(alle im aktuellen Verzeichnis suchen), werden sie erweitert und als Teil des Dateinamens erstellt, der den Zweck verfehlt, da der Befehl vom Bildschirm weggedrückt wird (sehr langer Dateiname). Wenn es keine Möglichkeit gibt, den Dateinamen horizontal zu scrollen less?