Передайте grep to less, показывая команду grep в качестве имени файла

792
Mike Dannyboy

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аргументами, но не пытаясь изобретать колесо здесь.

Это возможно только с помощью нескольких трюков командной строки?

1
`grep -H`? Разве не обманчиво показывать имя файла, так как это только вывод grep ... Xen2050 6 лет назад 0
Я хотел, чтобы «имя файла» в интерпретации `less -M` использовалось как команда grep; в моем примере команда была `grep asdf text.txt`, которая показывала бы как имя файла меньше, просто как напоминание о том, что я искал в первую очередь. Mike Dannyboy 6 лет назад 0

2 ответа на вопрос

1
thrig

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:'$ "$@"; } % echo hi|less hi echo hi 
Хорошо, спасибо. Таким образом, кажется, что это можно сделать в zsh, но не так просто в bash. Как я и думал, ничего просто. Спасибо за подробный ответ, всегда приятно узнавать что-то новое. Mike Dannyboy 6 лет назад 0
0
Mike Dannyboy

Я пошел против себя и написал небольшой сценарий, который выполняет это. Это не красиво, но работает и неплохо, так как всего несколько строк. Всегда готов к улучшениям.

#!/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?

Похожие вопросы