
スクリプトから、less
ファイルを呼び出して、新しい画面ではなくコンソールに出力を印刷するようにします。ファイルが 1 つの画面に収まるほど短い場合は、スクロールを無効にします。ファイルが 1 つの画面より長い場合は、スクロールできるようにし、一番下までスクロールしたらless
コンソールに制御を戻します。行も切り詰める必要があります (この場合、コンソール ウィンドウを超えた文字列の末尾が失われても問題ありません)。
また、特定のパターンを強調表示したいと思います。
引数に使用しているのは以下のものです:
less -SFXE -p "ccc" fileToShow.txt
テキストがコンソールより長くてスクロールが必要な場合には、長い行を-S
切り詰めたり、-FX
ファイルの行数がコンソールより少ないかどうかを検出してスクロールせずにすべてのテキストをコンソールに出力したり、ファイルの末尾に到達したら終了したりするために使用します-E
。less
-p
一致を強調表示するスイッチを追加するまでは、これらはうまく機能します。
fileToShow.txt に次の内容が含まれているとします。
aaa
bbb
ccc
ddd
eee
パターンスイッチがない場合、次のようになります。
[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $
パターン マッチングを追加すると、less はコンソールの高さまで空の行を出力します (空の行を表示するためにチルダを使用します)。
[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $
-p
スイッチを使用して、使用時に空の行を表示しないようにする方法はありますか-F
? (注: 「ccc」行は希望どおりに強調表示されますが、これは意図しない副作用です。)
私のシェルは でbash 3.2.25
、less バージョンは です436
。OS は RHEL です。
答え1
次のコマンドはバッチ ファイルにカプセル化できます。
grep --color=always -E "^|$2" "$1"|less -SFXER
パラメータは$1
ファイル名であり、$2
検索パターンです。注意点:
grep -E
(またはegrep
)複数の検索パターンに一致できます。- (行の先頭)に一致させることで
^
、すべての行がリストされることが保証されます。 - 一致すると
$2
検索文字列が強調表示されます。 grep --color=always
強調表示されたエスケープ シーケンスをパイプにコピーします。less -R
less
エスケープシーケンスを表示する代わりに、ハイライトを再現します。
これは最もすっきりした解決策ではありませんが、ある種の答えです。 コマンドはすべての行をリストし、パターンを強調表示しますが、 はless -p
最初の一致より前の行を省略することに注意してください。これを再現するには、 を使用する必要がありますsed
。
答え2
オールインという別の方法もありますless
。ただし、いくつかの手順が必要です。
less fileToShow.txt
- ヒットします
&ccc
(ccc
探しているパターンであると仮定します)。man ページから:&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.
- 最後に、F押すと追跡が再開されます
答え3
完全な解決策ではありませんが、いくつかの改善点があります-p
...
これらは、柔軟な+
フラグに依存しています。
コマンドラインオプションが で始まる場合
+
、そのオプションの残りの部分は、少ない例えば+G
、 少ない は、ファイルの先頭ではなく末尾から開始し、+/xyz
ファイル内で最初に出現する "xyz" から開始するように指示します。特別な場合として、+<number>
は のように動作します+<number>g
。つまり、指定された行番号から表示を開始します (ただし、上記の "g" コマンドの警告を参照してください)。オプションが で始まる場合++
、最初のファイルだけでなく、表示されているすべてのファイルに初期コマンドが適用されます。+
前述のコマンドを使用して、すべてのファイルの初期コマンドを設定 (または変更) することもできます。
-p
最初の一致にスキップします ( を使用する場合は、その数行前--jump-target
)。これは、短い場合に終了することと組み合わせて使用したいものではありません。スキップされた行は、ターミナルのスクロールバックでさえありません。
起動して
less
対話的に検索すると/ccc
、lessは最初に行を先頭から表示し、その後スクロールするので、だろう端末のスクロールバックバッファの一部になります。これをエミュレートするには+
、次のように明示的に再描画を要求する必要がありますr
。env LESS= less -SFXE +r/ccc fileToShow.txt
これはまだ
ccc
行までスクロールしますが、aaa
少なくともbbb
スクロールバック バッファ内にはあります。ただし、検索で多数の行がスキップされる場合は、次のようになります。seq 1000 | less -SFXE +r/980
スクロールバックには次のような内容が表示されます:
48 49 50 ...skipping... 980 981 982
これは によって調整可能だと予想していました
--max-back-scroll
が、検索には影響しないようです。編集: ウィンドウのサイズに依存するようです。つまり、1 つの画面を埋めてからスキップします。最初の行を見たくないなんて誰が言ったのでしょうか? 一致のみを強調表示したい場合は、空一致のトリックを使用できます。
less -SFXE '+r/ccc|$' fileToShow.txt
nしかし、これは/によるナビゲーションを中断します。検索Nではこのフラグを使用する方が適切です。
/
特定の文字は、パターンの先頭に入力すると特殊となり、パターンの一部になるのではなく、検索の種類を変更します
。...- ^K 現在の画面上のパターンに一致するテキストを強調表示しますが、最初の一致には移動しません (現在の位置を保持)。
charを含める構文はCtrl+Kシェルによって異なりますが、bash では次のように機能します。
less -SFXE $'+r/\cKccc' fileToShow.txt
~
いずれにしても、最初の行から始めると、画面を埋める回数も減ります。