知ってる様で知らないless

この記事は [ウェブクルー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/webcrew)の7日目の記事です。
昨日は@noko_kさんの「[SBTのversion conflict(s)解消方法まとめ](https://qiita.com/noko_k/items/6321c79b46dc27138571)」でした。
7日目は @wchikarusato が担当いたします。宜しくお願いします。

----
## はじめに
大抵のlinuxマシンには入っているであろうlessコマンド。
素でlessを打つだけでも十分に強力なツールですが、オプションやlessコマンドもかなり充実しており、知れば知る程にとても柔軟なツールである事が分かります。
以下に私自身が開発中に良く使うコマンドtipsを思いつく限り書いていきます。
ややlinuxに慣れた人向けの内容となりますが、知らない人でもなるべく分かる様に記載致します。
本稿がlessを使いこなす第一歩となれれば幸いです。

## lessの特徴
  lessの特徴はファイルを開くだけでなく、コマンドに | less とする事で
  コマンドの実行結果をあたかもファイルを開いてるかの様に参照できます。
  何でもvimで開くのではなく、ファイル編集にはvim、ファイル/コマンド結果の参照にはlessと使い分けるとGood
  尚、lessと同じ様なコマンドにcatとmoreがあります。以下がそれぞれの使いどころです。

- cat
   一気に最後まで表示するのが特徴です。
   ファイルを機械的に連結させる、bashやrubyのコマンドライン引数にファイルの中身を機械的に渡す等の時に使います。
   他にも、forコマンドと組み合わせて指先一つで変態的な動きをさせるetc.
  
- more
  lessと殆ど同じですが、末尾まで参照すると自動的にプロンプトへ戻るのがlessとの違いです。
  ls -lとかコマンドの結果が大量に表示されるのを上から順に見たい時に使用します
  (lessで良いのではと言われたらそれまで。less is more)


## 使えるlessのオプション3つ
  オプションなしでも十分に強力ですが、以下のたった3つのオプションを使う事により、lessは劇的に見やすく&使いやすくなります。
  もちろん、開いた後からコマンド一つで指定/解除できます。この辺の柔軟さは本当に素晴らしいです。

- 無条件でとりあえず指定するべきオプション

|Option|Description|
|:---|:---|
| -N |行番号が左につきます。ファイルだけでなく、コマンドの結果をもナンバリングするのがポイントです。かなり見やすくなるので是非。コピーしたい等で番号が邪魔な場合は開いてる最中に-NでEnterです。|
| -M |左下にプロンプト表示します。現在行や行数に対するパーセントが表示されて現在位置が把握しやすくなります。稀れに最後の行まで見ないとパーセント表示されない事があります。ちなみに大文字のMです。小文字だとパーセントだけになります。|
| -i |検索時に全部小文字で入力したときだけ、大文字小文字を無視して検索します。大文字を含めると完全一致で検索してくれます。小文字で曖昧に、大文字で完全一致と自動で検索を分けてくれるのがポイントです。中々に奥ゆかしい気の利かせ方をしてくれるオプションです。|

### コマンドをまとめると
```
$ less -iNM hoge.txt
```
  です!


## less起動中にかなり使うコマンド
  基本コマンドだけでも十分に強力ですが、以下のコマンドを使いこなすだけでも作業スピードは劇的(当社比10倍以上)に変わります。

- 基本コマンド

| Command | Description|
|:---|:---|
| j |次の行|
| k |前の行|
| gg|先頭に飛ぶ|
| G|末尾に飛ぶ|
| /word|wordを検索(nで次へ、Nで前へ) 検索ヒットした箇所が自動的に反転するのでviのデフォ設定よりかなり見やすいです|

- 閲覧中にv
  エディットモード。開いたファイルを編集したい時に使います。
  エディタから抜けると再びlessに戻ります。
  開かれるエディタは環境変数でデフォルト設定してるエディタです(大抵viかnano)

- 開いた後でオプション指定忘れた/解除したい
  -オプション で開いた後から指定/解除ができます

- 閲覧中に-S
  これはコマンドでなくオプションですが、最初から指定するよりも表示した後で必要に応じて指定/解除する事で威力を発揮するのでここに書きました。
  行が長くてターミナル上では見切れ様が、折り返さず1行に表示してくれます。
  webサーバーのアクセスログ等、一行が長いけど左側さえ見えればいい時に有効です。
  縦で差分を見れる様にもなるので、javaとかのデバッグログでも有効です。
  一度これに慣れてしまうとコマンド一つで折り返しと1列表示の切り替れないエディターではストレスを感じます

- 閲覧中に!コマンド
  閲覧中にシェルコマンドを実行します。less表示中、コマンド実行したい時に使います。
  less表示してる今のディレクトリは何だっけ? → !pwd
  ここにある他のファイルなんだっけ? → !ls
  と言った具合に使います。less開いてる最中、簡易的にlessで別のファイルを開いたりと応用は無限に広がります。

- less 起動中に shift+f
  tailと同じ様にファイルの中身を追従します。ctrl+c でキャンセルします。
  tailと違って、キャンセルしてまたless内で検索かけたり、ログ遡ったりみたいな事ができます。
  残念ながらgrepかけたのをlessしてそのまま監視とかは出来ません。
  それでも毎回tailしてキャンセルしてlessでファイル開いて調査してってやるよりは最初からlessで開いてる分だけ楽です。

- 複数のファイルを開く
  以下の例の様にファイルを複数指定してlessで開いてlessコマンドで表示ファイルを切り替えます。

```
例1. $ less -iNM *.txt
例2. $ find -name "*.txt" | xargs less -iNM
```

| Command | Description |
|:---|:---|
| :n|次のファイルへ|
| :p|前のファイルへ|
| :x|最初のファイルへ|

  lessでまとめて開いたり、上記の様に検索して見つけたファイルを片っ端から開くのに重宝します。
  慣れるとlsしてファイル名指定して1個1個開くのが非常に面倒に感じます。


## その他のtips
- Teratermで折り返さない様にコピー<br>teraterm.iniで以下を追加または変更し、teratermを起動し直すだけです

```
; Enable continued-line copy
EnableContinuedLineCopy=on
```
  ただし、1行で書かれたsqlなど、1行があまりにも長いとsshで遅延が発生するのか、普通に折り返してしまいます
  その場合はかなり面倒ですが、一旦ローカルにファイルを落としてサクラエディタとかでコピー。


- Shift-JISのファイルを開く

```
$ iconv -f SJIS hoge.txt | less
```
  windowsで作られたファイルをlinux環境で開いたらターミナルで日本語が文字化けしてて何も見えないって時に使うコマンドです。


## まとめ
lessの使い方が分かると、ファイルやログの調査をするのにわざわざwindowsでテキストエディタを開くよりも
linux環境で直接(または一旦linux環境にもって行って) lessで開いて調査した方が早かったりします。
(勿論、ターミナル上でlessをコピーするとミスる例がある通り、何でもlessで開けば良いという訳でもないですが...)
linuxにはgrepやfind等、高速で便利で且つ汎用性に富んだコマンドが他にも沢山ある為
サーバーサイドのエンジニアでなくても使えて損は無しです。

----
明日は、@kadota さんです。よろしくお願いします。

ウェブクルーでは一緒に働いていただける方を随時募集しております。
お気軽にエントリーくださいませ。

[開発エンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)
[フロントエンドエンジニアの募集](http://www.webcrew.co.jp/recruit/creative.html)
[データベースエンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000023)