エンジニア2年目までに覚えてぼちぼち使っているshellとvimのコマンドあれこれ。

前書き
===

ソニックムーブに新卒として入社して1年と半分以上が経った。
入社以来サーバサイドのエンジニアとして働いてきた中で、使用頻度がぼちぼちとあるshellとvimのコマンドを羅列する。

shell
===

## find

指定したディレクトリ配下にあるファイルやディレクトリを探す。
後述の `xargs` とつないでよく使う。対象が多いと当然重い。

```
$ find ./ -name *.png
.//test-file/png_img.png
```

## xargs

標準入力で受け取ったリストの各文字列を引数に、与えたコマンドを実行する。
下記みたいにしてこのクラスどこで使ってたっけみたいなときに使う。

```
$ find ./ -type f | xargs grep aaa
.//test-file/csv.csv:"aaaa","AAAA",0
```

## sed

標準入力で受け取った文字列に置換や削除を行う。
`initctl list` の結果を整形して `xargs` に渡してやって、一括でデーモン止めたり動かしたりとかそんな感じで使う。

```
$ cat file/single_column.csv 
3h4rebugsowpklnj4hgrijwsd
awbehvfjdlknhruwigroibfkn
wribefueviwe03948urgnvmfj
urgibofknj3u940rtogkjvuis

$ cat file/single_column.csv  | sed 's/[0-9]/-/g'
-h-rebugsowpklnj-hgrijwsd
awbehvfjdlknhruwigroibfkn
wribefueviwe-----urgnvmfj
urgibofknj-u---rtogkjvuis
```

## patch

差分を適用する。
本番に反映してからミスがあってその場で修正したとかしたときに、 `git diff` したのをファイルにして開発環境に修正あてるとか。

```
$ tail file/diff.*
==> file/diff.1.txt <==
ABCD IJKL
MNOP EFGH
QRST UVXY

==> file/diff.2.txt <==
ABCD EFGH
IJKL MNOP
QRST UVXY

$ diff file/diff.*
1,2c1,2
< ABCD IJKL
< MNOP EFGH
---
> ABCD EFGH
> IJKL MNOP

$ diff file/diff.* > tmp.diff

$ patch file/diff.1.txt  < tmp.diff 

$ tail file/diff.*
==> file/diff.1.txt <==
ABCD EFGH
IJKL MNOP
QRST UVXY

==> file/diff.2.txt <==
ABCD EFGH
IJKL MNOP
QRST UVXY
```

## top

システムの負荷状況を見る。
これ見てどれがcpuすごい食ってるとかそういうの見る。
まだまだ全部は理解できてない

```
$ top
CPU usage: 6.32% user, 4.37% sys, 89.29% idle
SharedLibs: 132M resident, 20M data, 21M linkedit.
MemRegions: 52031 total, 5502M resident, 135M private, 1827M shared.
PhysMem: 15G used (2246M wired), 1124M unused.
VM: 767G vsize, 533M framework vsize, 0(0) swapins, 0(0) swapouts.
Networks: packets: 14862661/16G in, 14726325/15G out.
Disks: 245003/7723M read, 249436/5865M written.

PID    COMMAND      %CPU TIME     #TH   #WQ  #PORT MEM    PURG   CMPR PGRP
79425  top          2.1  00:00.27 1/1   0    21    2356K+ 0B     0B   79425
78529  Google Chrom 0.2  00:31.93 16    1    148   219M+  0B     0B   582
78284  mdworker     0.0  00:00.50 4     0    58    11M    0B     0B   78284
```

## ps

走っているプロセスの一覧を表示する。
ちゃんとサーバ動いているのかとか、変なの走ってないかとか見る。

```
$ ps aux
USER               PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
user               578   4.1  1.1  2884020 184828   ??  S     9:47AM  14:01.70 /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
user               582   2.6  3.3  3905564 561304   ??  S     9:47AM  39:24.02 /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
```


VIM
===

## :g/hoge

grep的な。
指定したパターンにマッチした行だけ表示する。
開いているclassファイルに定義しているメソッド一覧とか出せる。

```
:g/function
  8     public function __construct ()
 15     public function setName ($name)
 23     public function getName ()
Press ENTER or type command to continue
```

## :v/hoge

上の逆、指定したパターンにマッチしない行を表示する。
`:g` もそうだが最後に `/d`　を指定すると該当行を削除できる。

```
 "AAAA",0
 "BBBB",1
 "CCCC",2
 "DDDD",3
 "EEEE",4
 "AAAA",5
 "BBBB",6
 "DDDD",7
 "EEEE",8
 "AAAA",9

:v/AAAA/d
```

結果

```
 "AAAA",0
 "AAAA",5
 "AAAA",9
```

## qq + @q

`q` をタイプ後アルファベットをタイプすると `recording @q`みたいな表示がされてもう一度 `q` をタイプするまでの操作を記憶する
そのあと `@` をタイプして続けてさっきタイプしたアルファベットをタイプすると記憶させた一連の操作を実行する。

例えば下記テキストファイルを開いて1行目先頭にカーソルがあるとする。

```
"AAAA",0
"BBBB",1
"CCCC",2
"DDDD",3
"EEEE",4
"AAAA",5
"BBBB",6
"DDDD",7
"EEEE",8
"AAAA",9
```

その状態から

```
qq
0
f,
dl
0
P
$
T"
d$
0
P
j
q
```

と一連の操作を行うと以下のようになる

```
0,"AAAA"
"BBBB",1
"CCCC",2
"DDDD",3
"EEEE",4
"AAAA",5
"BBBB",6
"DDDD",7
"EEEE",8
"AAAA",9
```

ここから `9@q` を実行すると

```
0,"AAAA"
1,"BBBB"
2,"CCCC"
3,"DDDD"
4,"EEEE"
5,"AAAA"
6,"BBBB"
7,"DDDD"
8,"EEEE"
9,"AAAA"
```

といった感じで一行の変更を残りの行にも適用できる。

## :ls

バッファの一覧を表示する。

```
:ls
  1      "file/csv.2.csv"               line 1
  2 #    "file/csv.csv"                 line 1
  3 %a   "file/diff.1.txt"              line 1
```

## :b[num]

バッファを開く。
例えば `:ls` の結果が上だとすると `:b1` を実行するとfile/csv.2.csvがカレントウィンドウに開かれる。

## :enew

新しい空のバッファを開く。
ファイルを操作していて、メモがとりたくなったとする。
そんなときは `:vs` や `:sp` からの `:enew` を実行。
これでメモ用の空のウィンドウを開くことができる。

〆
===
まだまだ「そんなことしなくても、これでできるよ」と言われることもたくさんですが、これだけ覚えただけでも大分と作業の質と速さは上がりました。
もっともっとツールの力を引き出す使い方をしてやりたいものです。

*
*
*

この記事は 株式会社ソニックムーブ Advent Calendar 2017 11日目の記事です。
アドベントカレンダーはこっち。 -> https://qiita.com/advent-calendar/2017/sonicmoov
ソニックムーブについてはこっち。 -> https://www.sonicmoov.com