Передайте grep в less, показывая команду grep в качестве имени файла
less -M
покажет имя файла в виде приглашения, как в:
1 asdf
test.txt lines 1-1/1 (END)
Мне нравится использовать grep для упрощения чтения. Могу ли я получить меньше, чтобы интерпретировать команду grep как имя файла для ее приглашения?
Обычно это просто:
grep asdf test.txt | less
:
1 asdf
lines 1-1/1 (END)
Мне бы хотелось:
grep asdf test.txt | less
:
1 asdf
grep asdf test.txt lines 1-1/1 (END)
Я знаю, что могу обернуть все это в сценарий и делать вещи с $0
аргументы, но не пытаясь изобретать колесо здесь.
Это возможно только с помощью нескольких трюков командной строки?
2 ответа
less
не имеет ни малейшего представления о том, что находится на другой стороне канала, который передает данные в него через стандартный ввод, если кто-то не сильно усложнит код для less
найти группу процессов, которая less
работает и другие процессы в этой группе процессов, а затем кто знает, как все они сочетаются друг с другом (оболочка знает эту информацию, но может не сделать ее доступной).
Из некоторого чтения в less(1)
можно найти -P
возможность настроить подсказку
$ echo hi | less -P '?f%f:Standard input'
hi
Standard input
так что в теории, если мы можем заменить Standard input
немного с текущим конвейером оболочки... давайте посмотрим, что set
когда less
работает...
$ function less { set > whatisset; command less "$@"; }
$ echo foo | less
foo
$ egrep 'echo|foo' whatisset
$
так что ничего очевидного для использования mksh
, как echo
или же foo
(эквивалентно вашему grep
) не появляются нигде в среде оболочки (та же история для zsh
и вау bash
в Linux когда-либо спамит среда с настройками, но опять та же история). На самом деле, с zsh
мы можем использовать preexec
функция, чтобы сделать командную строку доступной:
$ zsh
% function preexec { shift; SHORT=$1; }
% function less { set > whatisset; command less "$@"; }
% echo foo | less
foo
% grep SHORT whatisset
SHORT='echo foo | less'
%
так что можно сделать что-то вроде
% less() { =less -P '?f%f:'${SHORT%% | less} "$@"; }
% echo hi|less
hi
echo hi
Я пошел против себя и написал небольшой сценарий, который выполняет это. Это не красиво, но работает и неплохо, так как всего несколько строк. Всегда готов к улучшениям.
#!/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"
Беги как ./scriptname grep <opts> <regex> <file(s)>
,
Недостаток: если file
является *
(ищите все в текущем каталоге), затем они раскрываются и делаются как часть имени файла, которое побеждает цель, так как выталкивает команду с экрана (очень длинное имя файла). Если нет способа прокрутить имя файла по горизонтали в less
?