ハクソク

世界を動かす技術を、日本語で。

アソートされたレッスン(1)ティップス

概要

less(1)コマンドの便利な使い方をまとめたTips集。
複数ファイル操作や検索、ブックマーク、オプション切替など実用的な機能を紹介。
コマンドやキー操作ごとに具体例と用途を解説。
初心者から中級者まで役立つ情報を網羅。
lessをより効率的に使いこなすための実践テクニック集。

less(1)の便利な使い方まとめ

  • lessは、ファイルやコマンド出力をページ単位で閲覧できるページャーコマンド。
  • パイプラインの最後で使うことが多いが、ファイル名を直接指定して起動も可能。
    • 例: less README.txt file.c *.md

ファイル操作

  • 起動後にファイル追加: :e file.hでファイルリストに追加。
  • 複数ファイル間の移動: :nで次のファイル、:pで前のファイルへ移動。
  • 最初のファイルに戻る: :xでファイルリストの先頭にリワインド。
  • ファイルリストから削除: :dで現在のファイルをリストから削除。

ナビゲーション

  • 特定行へのジャンプ: 数値Gで指定行に移動(例: 3141Gで3141行目へ)。
  • ファイル内の割合で移動: 数値%でファイルの指定パーセンテージ位置にジャンプ(例: 75%)。
  • 行番号表示: オプションで有効化可能。

検索機能

  • 前方検索: /パターンで前方検索、?パターンで後方検索。
  • 検索の繰り返し: nで次、Nで前の一致箇所へ。
  • 修飾子の利用:
    • ! : パターンに一致しない行を検索
    • * : 複数ファイルをまたいで検索
    • @ : 最初のファイルから検索
    • @* : 最初のファイルから複数ファイル検索
    • 例: /@*patternで全ファイルを最初から検索

行のフィルタリング

  • &パターンでパターンに一致する行のみ表示(内部grep的機能)。
  • &!パターンでパターンに一致しない行のみ表示。
  • ログファイル閲覧時などに便利。

ブックマーク機能

  • マーク設定: m+任意の英字で現在位置をブックマーク。
  • マークへジャンプ: '+同じ英字でマーク位置に戻る。
  • 全ファイル共通: 任意のファイル間で有効。
  • 用途例: manページのOPTIONSセクションにmoEXAMPLESme'o'eで往復。

括弧の対応ジャンプ

  • 画面最上部に(, [, {がある場合、その文字を押すと対応する閉じ括弧へジャンプ(画面最下部の場合は逆)。
  • カスタムペア: Alt+Ctrl+fAlt+Ctrl+bでペア文字指定も可能(例: <>)。

オプションの動的切替

  • less内で-+オプション文字で各種設定を切替可能。
    • -S : ワードラップ切替(長い行の折り返し)
    • -G : 検索結果のハイライト
    • -i/-I : 検索時の大文字・小文字の区別
    • -R : ANSIカラーの有効化
    • -N/-n : 行番号表示/非表示

外部コマンド実行

  • !コマンドで外部コマンドを実行(例: !date!bc)。

デフォルトオプションの設定

  • よく使うオプションは環境変数LESSに設定可能(例: LESS="-RNe")。

その他の便利機能

  • タグジャンプ: ctagsで生成されたタグファイルを利用可能(vi/vimのような定義ジャンプ)。
  • 編集モード: vで現在のファイルを$VISUALエディタで開く。
  • 出力の保存: oで現在の内容をファイルに保存、Oで上書き保存。

less(1)のTipsまとめ

  • lessは多機能で柔軟なページャー、ファイル閲覧やログ確認、ソースコード調査に最適。
  • 複数ファイルの切替、検索、フィルタ、マーク、オプション変更など多彩な操作性
  • 環境変数やコマンド内オプションで自分好みにカスタマイズ可能。
  • 機能を知ることで作業効率や快適さが大きく向上

Hackerたちの意見

最近、長いログファイルをデバッグする時に使ってるテクニックなんだけど、`&`を使って読みたいものをフィルタリングして、`&!`で役に立たないものを除外するのが便利なんだよね(正規表現も使えるし)。確かに、ちょっと遅い時もあるけど、`grep -v`を使ってパイプする方が速いのは分かってる。でも、事前に何をフィルタリングするか分からない時に、ログファイルのノイズを取り除くのに助けられたことが何度もあるよ。:) 追記:これはTFAにあった話。
あと、-Xや--no-initは「...非初期化文字列が画面を消去するような不要なことをする場合は望ましい」とのこと。画面を消去したくないから、私はあんまり使わないかな。何かを参照したり、内容から現在のコマンドラインにコピー&ペーストしたい時が多いし。
それに、-Eと組み合わせると、出力がターミナルのサイズより小さいとすぐに終了するんだ。…それと、投稿の他のオプションと組み合わせると、私の定番は「less -SEXIER」なんだ。Eを二回指定しても、覚えやすくなるだけで特に意味はないみたい。
フォローを見逃したのは驚きだね!ちょっと使いづらいけど、慣れると多くの場面でtailよりも良いと思う。`less +F`を使うと、標準入力や指定したファイルを追いかけ始めるんだ。追跡を中断して、通常の`less`セッションで検索できるようになる。`F`(大文字ね)を押すと、再び追跡が始まるよ。そうそう、セッション内で`F`を押せば、+Fを忘れても追跡を始められるから安心して。
Fを押すってことを知らなかったのがめっちゃ悔しい!
自動で新しい出力を拾ってくれるモードがあったらいいな。ターミナルみたいに、自由にナビゲートできるやつね。そうすれば、下の方にいるときだけオートスクロールのトグルが必要になるし。
`tail`を使うと、最後の行の後に空行をいくつか入れるためにエンターを何回か押せるよ。これは、関数を何度もトリガーして、各試行の行グループを簡単に見たいときに便利。`less`が使えるのに、まだ`tail`を使う唯一の理由だね。
パイプをフォローしているとき(例えば、`kubectl logs | less +F`)は、パイプライン内のすべてのプロセスに送信されるから、`less`がフォローをやめちゃって、他のプロセスも完全に停止しちゃう。そうなると、Fでフォローを再開したり、Gでデータをもっと読み込むことができなくなる。`less`にはフォローをやめる代替手段があるけど、ほとんどのシェルに妨害されちゃうんだよね。
ちょっと話がそれるけど、「フォロー」って、ファイルディスクリプタのトリックで、ファイルを読みながら「ストリーミング」しなきゃいけないと思ってたんだ。だから、普通にファイルを開くのとは互換性がないんだろうなって。実際には「EOFの後もポーリングを続ける」だけだって知ったときは驚いたよ。つまり、普通にファイルを開くのと「フォロー」するのに全く違いがないってこと。ソフトウェアは簡単にこの2つの「モード」を切り替えられるんだね。
パイプからデータをファイルに保存するには`s`を押すこともできるよ。手動でコピー&ペーストする必要がないから便利。
同じことを提案しに来た!これめっちゃ便利で、仕事でいつも使ってるよ。すごく長い時間動くプロセスがあって、その出力が役に立つかどうかわからないけど、役に立つならキャッチしたいんだ。だから、普通はそれを`less`にパイプして、実行が終わったら内容を確認する。必要なら`s`を使ってファイルに保存するよ。(`tee`を使うこともできるけど、そうすると役に立たない出力でも常にファイルにダンプしちゃうからね。)
lessは~/.lesskeyファイルで設定できるよ。私の設定には、sをバックスクロールにバインドする一行だけ入れてるんだ。だから、dとsが隣同士になって、片手で素早くページアップ/ダウンできる。macOSを使ってるなら、Homebrewからlessをインストールしないとこれが使えないか、デフォルトのlessを置き換えないといけないかもね。[1] https://github.com/jez/dotfiles/blob/master/lesskey#L2 [2] https://apple.stackexchange.com/questions/27269/is-less1-mis...
Nを次のファイルにバインドするのも好きだよ。MacOSにlesskeyがないのが本当にイライラする!
何度も助けられた二つのこと:-L: 入力ファイルの前処理をスキップする。logfile.1やlogfile.2みたいな回転ログファイルを開くと、いくつかのディストリビューションのデフォルトの前処理がそれをmanページのソースとして認識して、nroffを通してパイプしてくれるんだ。ファイルが大きいと、これが面倒な遅延を引き起こすんだよね。-Lを使うとそれをスキップできる。検索文字列の最初の文字にCtrl-Rを使うと、そのリテラル文字列を検索することになるから、正規表現じゃなくていいんだ。検索文字列に正規表現のメタキャラクターが含まれていて、エスケープするのが面倒な時には便利だよ(もちろん、正規表現の機能が必要ない時にね)。
`less`で構文ハイライトやファイルレンダリング(PDFやMarkdownみたいな)を有効にできることを忘れないでね。lesspipeを使えば、すごく便利で読みやすさが大幅に向上するよ。この機能は通常パイプでは無効になってるから、スクリプトが意図した通りに動くって確信できるのがいいね。
OpenBSDのmanのちょっとマニアックな機能の一つは、ページャー(less)にタグを提供することなんだ。だから、man kshで「:t test」みたいなことができて、そのセクションにすぐ行ける。機能自体は面白いと思うけど、既存の機能の賢い使い方だと思うけど、実際には使ったことがないな。情報ページと同じようなもので、技術的に優れたソリューションが、シンプルなmanページに負けちゃった理由だと思う。シンプルで均一なインターフェース「/を押して検索、すべての情報が一つの文書に」ってのは、より良いシステムよりも認知的にずっと楽だもんね。最後に、BSDはmdocのtroffマクロセットを使って意味的なmanページを作ってるんだ。latexがtex組版エンジンで意味的な文書を作るのと似てる。Linuxのmanページは通常プレーンなtroffだけど、OpenBSDはさらに一歩進んで、以前使われていたtroff + mdocマクロの代わりに特定のmandocプログラムを使ってレンダリングしてるんだ。https://man.openbsd.org/mdoc
もしかして見逃したかもしれないけど、外部コマンドへのパイプ処理ってあまり注目されてないの?マークを設定して、他の場所に移動してから、そのマークとの間のエリアを保存するんだ。具体的には、ma(マーク「a」を位置に設定)、jjj(3行下に移動)、|a(現在の位置から「a」マークにパイプして、!プロンプトが出るから、次に...)cat >somefile(これで選択したテキスト、現在の位置からマーク「a」までをsomefileにダンプする)。これはニュースやメールのスニペットを保存するのにすごく便利だったよ。それと、-jオプションもね。検索のための行位置を設定して、コンテキストが利用できるようになる。例えば、-j8を使うと、検索は画面の上から8行目から始まるってこと。
`less`のパイプ機能を使って、git-logにインタラクティブ性を加えてる。コミットが「選択」されると(画面の一番上の行)、通常はn/Nの連続の後に、ショートカットを押してそのコミットにアクションを実行できるんだ。今は主に2つのことに使ってる。1つ目は、興味のあるコミットに対してgit-showを実行すること。面白いのは、git-showのlessを終了すると、git-logのlessに戻ることができるんだ。スタックされる感じ。2つ目は、1のコマンドで確認した後にコミットを修正すること。git-absorbやgit-fixupで問題が多かったから、自分でやるのが好きなんだ。特定のコマンドが実行されているときに検出して、キーボードショートカットを設定して、lessにキーシーケンスを送って、最終的に画面の一番上の行を自分の短いスクリプトにパイプしてコミットハッシュを抽出して何かをするようにしてる。[1]: bashのデバッグトラップを通じて、ターミナルのタイトルを設定して、それがkeyd-application-mapperによって検出される。別の設定も可能だけど、昔はtmuxを使ってたよ。
`^q`で`less`を終了させて、画面をクリアしない方法があるよ(`less -X`みたいに)。一方で、`q`は`less`を終了させて画面をクリアする(普通の`less`みたいに)。1. `echo '^q toggle-option -redraw-screen\nq' >> ~/.config/lesskey`を実行。2. `less`を`-X`なしで呼び出すことを確認してね(確実にしたいなら`-+X`を使ってもいい)。この`^q`コマンドは、`git log`の出力や、次のターミナルコマンドで参照する必要があるものに特に便利だよ。(実際、`git`はデフォルトで`less -FRX`を使ってるから、上記のように動作させるにはその設定をオーバーライドする必要がある)。`q`コマンドは、`less`を呼び出す前に画面にあったものを失いたくないときに役立つよ。