【history】Linuxのコマンド履歴を再利用するテクニック

# コマンド履歴を再利用するテクニック
## 目次
1. [テクニックその1（history + !）を駆使する](#テクニックその1history--を駆使する)
1. [テクニックその2（history + grep）を駆使する](#テクニックその2history--grepを駆使する)
1. [テクニックその3（Ctrl + R）を駆使する](#テクニックその3ctrl--rを駆使する)

---
とある日のこと。

後輩ちゃん「よし！やっとコマンド入力できた！あとは実行するだけ！」

```
$curl -h 'Authorization: Bearer access_token' 'https://qiita.com/api/v2/items/a403e97626433a5bc94c' | jq | grep page_views_count
parse error: Invalid numeric literal at line 1, column 6
```
後輩ちゃん「あれ、エラーが出ちゃった」
後輩ちゃん「curlのリクエストヘッダのオプション（-h）は大文字（-H）じゃなくちゃいけないのか！」
後輩ちゃん「打ち直しか...少し面倒くさい...」

すずこ「ちょっと待った！！」
すずこ「また1から打ち直そうとしていないかい？」

後輩ちゃん「良い方法あるんですか？((ｷﾗｷﾗ」

すずこ「方向キーの上矢印を押してごらん」

後輩ちゃん「わわわわ、直前に打ったコマンドが出てきました！」

すずこ「方向キーの上下矢印はコマンド履歴を遡ってくれるんだよ」

（せっかくなので、コマンド履歴を再利用するテクニックを共有しよう）

## テクニックその1（history + !）を駆使する
> historyコマンド：コマンドの入力履歴を再利用するコマンド

すずこ「`history`コマンドを打ち込んでみて」

```
$history
1  ls -l
2  cd ~
3  pwd
4  ls -l
5  curl -h 'Authorization: Bearer access_token' 'https://qiita.com/api/v2/items/a403e97626433a5bc94c' | jq | grep page_views_count
```
後輩ちゃん「過去に入力したコマンドが表示されました」
後輩ちゃん「なるほど、`history`コマンドを打って、もう1回使いたいコマンドを**コピペ**すればいいんですね！」

すずこ「それでもいいんだけど、表示されたコマンド履歴に**番号**が割り振られているよね」
すずこ「`! + 番号`をコマンド入力すると、その番号が割り振られているコマンドが再実行されるんだ」

後輩ちゃん「てことは、`!5`とコマンド入力すれば、あの長いcurlのコマンドを再入力してくれるんですか！（上記参照）」

すずこ「その通り！試しに打ち込んでごらん」

```
$history
1  ls -l
2  cd ~
3  pwd
4  ls -l
5  curl -h 'Authorization: Bearer access_token' 'https://qiita.com/api/v2/items/a403e97626433a5bc94c' | jq | grep page_views_count

$!5
curl -h 'Authorization: Bearer access_token' 'https://qiita.com/api/v2/items/a403e97626433a5bc94c' | jq | grep page_views_count
parse error: Invalid numeric literal at line 1, column 6
```
後輩ちゃん「おお！実行されて、しっかりエラーも出ました」

すずこ（しまった、エラーが出るコマンドだった...）
すずこ（エラーはおいといて）

すずこ「そんな感じで、過去に打ったコマンドを再利用したいときは、`history + !`を駆使すると効率良く作業ができるね」

後輩ちゃん「ただ、今は5件しかコマンド履歴ないですが、それが100件とか1000件になったら探すの面倒くさいですね！((ﾆｺﾆｺ」

すずこ（相変わらず、良いところに目を付けるな～）

## テクニックその2（history + grep）を駆使する
> grepコマンド：特定の文字列を検索するコマンド

すずこ「そんな時は、`history + grep`を駆使しよう！」
すずこ「`history | grep [検索したい文字列]`を打ち込むことによって、」
すずこ「コマンド履歴の中から**検索したい文字列**を含むコマンドのみを抽出してくれるんだよ」
すずこ「例えば、1000件あるコマンド履歴から**mysql**を含むコマンドを抽出したい場合」
```
$history | grep mysql
 34  mysql -hlocalhost -uroot -p
 67  mysql --version
104  mysql -hlocalhost -uroot -phogehoge
```
すずこ「こんな感じで、**mysql**を含むコマンドだけが抽出することができたね」

後輩ちゃん「膨大なコマンド履歴から、目で探すのは大変だから、他のLinuxコマンド（今回はgrep）と掛け合わせることで、効率よく求めているコマンドを探すことができるんですね！」

後輩ちゃん「でも結局、過去のコマンドを少し変えたいときは、やっぱり**コピペ**になるんですか...？」

すずこ（鋭い）

すずこ「確かに、`history + !`の方法だと、そのコマンドが実行されてしまうから、少し変えたいときは不便だよね」

## テクニックその3（Ctrl + R）を駆使する
> Ctrl + R：コマンドライン上で検索モードになる

すずこ「そんなときは、Ctrl + R のショートカットを入力してごらん」

後輩ちゃん「reverse-i-searchと表示されました」
```
$ 
(reverse-i-search)`':
```
    
すずこ「そこに**検索したい文字列**を入力すると、**検索したい文字列とマッチ**するコマンドが表示されるの」
すずこ「試しに`mysql`と打ち込んでみようか」

```
$ 
(reverse-i-search)`mysql': mysql -hlocalhost -uroot -phogehoge
```

後輩ちゃん「すごい！候補のコマンド履歴が表示されました」

すずこ「表示されているコマンドが**求めているコマンドと異なる場合**は、」
すずこ「さらに`Ctrl + R`を入力すると、後方検索（次の候補を検索）してくれるんだよ」

後輩ちゃん「ふむふむ」

すずこ「その状態で、**Enterキー**を押下すると実行されるし、」
すずこ「少し修正したい場合は、**方向キーの左右矢印キー**を押下すると実行せずにコマンド入力してくれんだよ」

後輩ちゃん「本当ですね！**方向キーの左右矢印キー**を押したら、コマンドが表示されました！」
後輩ちゃん「これでコマンドの修正ができます！」

```
(reverse-i-search)`mysql': mysql -hlocalhost -uroot -phogehoge

↓ 方向キーの左右矢印キー押下後

$mysql -hlocalhost -uroot -phogehoge
※コマンドは実行されずに、入力される
```

## まとめ
後輩ちゃん「なるほど！**history**での検索も、**Ctrl + R**での検索もどちらも良し悪しがあるって感じですね！」

後輩ちゃん「**history**はコマンド履歴を一覧表示してくれるから、求めているコマンドを探しやすい」
後輩ちゃん「**Ctrl + R**は入力が手早くできるし、コマンドの修正もしやすい」
後輩ちゃん「状況に応じて、使い分けするのがよさそうですね！」

すずこ（ぼくの出番が...）

---
以上。