俺がよく使うLinux, Vim, Shellコマンド (不定期更新)

## 連続コマンド実行

実行コマンドがパイプ等使わない単純なものはwatchを使うことが多い。

```bash
# -n: 実行間隔
# -d: 差分を強調表示
watch [-n 秒数] [-d] 実行コマンド
```

実行コマンドがパイプや複数ある場合はwhileを使うことが多い。
※sleepコマンドを入れないと大量に実行されることになるので注意。

```bash
while true; do; 実行コマンド1; 実行コマンド2; done 
```

## 負荷をかける

```bash
openssl speed
```

## ファイルの頭○行表示

※30行表示

```bash
head -n 30
```

## ファイルの後ろ○行表示

※30行表示

```bash
tail -n 30
```

## 書き込まれていくログファイルの中身を随時表示

```bash
tail -f ファイル名
```

## 書き込まれていくログファイルで、ある文字が入っている場合のみ随時表示

```bash
tail -f ファイル名 | grep ある文字
```


# MySQL

mysqldumpする時gzipで圧縮してからファイルに書き出す。
こうするとディスクIOが節約できて早く終わる時がある（性能次第）。

```bash
mysqldump -u ユーザ名 -p DB名 | gzip > hoge.gz
```

# コミット済みのユーザ名を変更

```bash
git filter-branch --commit-filter '
    GIT_AUTHOR_NAME="名前"
    GIT_AUTHOR_EMAIL="メールアドレス"
    GIT_COMMITTER_NAME="名前"
    GIT_COMMITTER_EMAIL="メールアドレス"
    git commit-tree "$@"
' HEAD
```

[Git の Commit Author と Commiter を変更する \- Qiita](https://qiita.com/sea_mountain/items/d70216a5bc16a88ed932)


# awkする時最初の一行を飛ばす

```bash
awk 'FNR > 1 { (処理) }'
```

# 定期的に何か実行する

```bash
while true; do; (処理1); (処理2); sleep 5; done
```

# 設定ファイルをワンライナーで変更

```bash
sed -e 's/(置き換え前文字列)/(置き換え後文字列)/' (設定ファイルパス)
```

実際にやるときはこんな感じでバックアップを残しつつdiffを取ったほうがいい。

```bash

SUFFIX=`date +%Y%m%d%H%M%S`
sed -i.$SUFFIX -e 's/(置き換え前文字列)/(置き換え後文字列)/' (設定ファイルパス)
diff (設定ファイルパス) (設定ファイルパス).$SUFFIX
```

置き換え前後の文字列に/(スラッシュ)が含まれている場合はsedの区切り文字を変更するとエスケープの手間が省けて良い。

```bash
sed -i.$SUFFIX -e 's|(スラッシュが含まれる置き換え前文字列)|(スラッシュが含まれる置き換え後文字列)|' (設定ファイルパス)
```

# メールサーバーのTLS証明書期限チェック

```bash
openssl s_client -connect (メールサーバーのドメイン):465 < /dev/null 2> /dev/null | openssl x509 -text | grep Not
```

# ログアウト後も実行させ続けたいコマンドを実行

```bash
nohup 実行したいコマンド &
```

# 定時過ぎたからPC落としたいけどSSH先のコマンドの実行が終わらないから落とせない/ログアウトできないとき (nohup忘れ)

プロセスをバックグラウンドに移行

```bash
Ctrl-z
bg
```

ジョブ番号を調べる

```bash
jobs
```

シェルのジョブテーブルから削除 (ジョブ番号が1番だったとき)

```bash
disown %1
```

# サーバーの負荷をいろいろ調べる

```bash
w
top
iotop
```

# 手順書用のファイルバックアップコピーコマンド (実行時の時刻をファイル名に埋め込む)

```bash
cp -aiv hoge hoge.$(date +%Y%m%d%H%M%S)
```

こんな感じでファイルがコピーされる

```
hoge.20190905-182437
```

# ~ここからVim~

## カーソル行の数字の加減算

一を足す

```vim
<C-a>
```

一を引く

```vim
<C-x>
```


## 連番生成

↑gを付けると連番を作ってくれる。ビジュアルモードで範囲選択後下記コマンド実行

```vim
g<C-a>
```

[Vim 8\.0 Advent Calendar 12 日目 連番の生成 \- Qiita](https://qiita.com/thinca/items/bd962d8ac517d6844c8c)


## 行頭に文字を追加する

```vim
I
```

## 行頭にカーソルを合わせる

```vim
0
```

## 複数行の行頭に文字を追加する

※カーソル行から３行の行頭に文字を追加したいとき

```vim
<C-v>jj0I
```

## 行末に文字を追加する

```vim
A
```

## 行末にカーソルを合わせる

```vim
$
```

## 複数行の行末に文字を追加する

※カーソル行から３行の行末に文字を追加したいとき

```vim
<C-v>jj$A
```

## 複数行のある部分に文字を追加する

※カーソルがあるところ３行に文字を追加したいとき

```vim
<C-v>jjI
```

## ファイル内のすべての文字を置き換えする

```vim
:%s/置き換え前/置き換え後/gc
```

## 特定行の文字を置き換えする

```vim
:%置き換え開始行番号,置き換え終了行番号/置き換え前/置き換え後/gc
```

## 同じ作業を繰り返す

```vim
qa
(繰り返したい作業を行う)
q
```

先程の作業を１０回実施

```vim
10@a
```

# ~ここからAWS CLI~

## 私はだれ？

```shell
aws sts get-caller-identity
```

※UserIdはAccess Key IDとは別なので注意

```shell:result
{
    "Account": "11111111111111",
    "UserId": "AAAAAAAAAAAAAAAAAAA",
    "Arn": "arn:aws:iam::11111111111111:user/BBBBBBBBBB"
}
```

## インスタンスのプライベートIPアドレスとNameタグをインスタンスごとに表示

```bash
aws ec2 describe-instances --query 'Reservations[].Instances[].{IP:PrivateIpAddress,Name:Tags[?Key==`Name`].Value|[0]}'
```

# Chrome

## スマホ表示にする

Command + Shift + cを押して、スマホ&タブレットボタンを押す

## スクリーンショットを取る

Command + Shift + pを押してscreenshotと入力。

Capture full size screenshotでページ全体のスクリーンショットが撮れるほか、Capture node screenshotでは選択しているDOMツリーの表示要素のみ撮ることができる。