前書き
ソニックムーブに新卒として入社して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