コマンドたち

# 前提
すぐ忘れるので書いていきます。

# sed
・コメントアウト削除

```
　sed -e '/^#/d' ファイル名
```

・空白行削除

```
　sed -e '/^$/d’ ファイル名
```

・コメントアウト ＋ 空白行の削除

```
　sed -e '/^#/d; /^$/d' ファイル名
```

・指定行の前に挿入

```
# 行指定（3行目の前にaaaを挿入する場合）
　sed '3i aaa' ファイル名

# 対象文字列指定（aaaの前にbbbを挿入する場合）
　sed '/aaa/i bbb' ファイル名
```

・指定行の後に挿入

```
# 行指定（2行目の後にaaaを挿入する場合）
　sed '2a aaa' ファイル名

# 対象文字列指定（aaaの後にbbbを挿入する場合）
　sed '/aaa/a bbb' ファイル名
```

・スラッシュを含む文字列の下に文字を挿入したい場合
スラッシュの前に \ を入れる

```
対象文： /var/log/httpd/access_log
挿入文： CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/sample_access_log.%Y%m%d 86400 540" ltsv env=!no_log
sed -e '/\/var\/log\/httpd\/access_log/a CustomLog "|\/usr\/sbin\/rotatelogs \/var\/log\/httpd\/sample_access_log.%Y%m%d 86400 540" ltsv env=!no_log' /etc/httpd/conf/httpd.conf
```

・挿入時にインデントを揃えたい場合
aの後ろに \ を入れる
a\ の後に指定したい分のインデントを入れる

```
sed -e "/\/var\/log\/httpd\/access_log/a\  hoge" /etc/httpd/conf/httpd.conf
```

・バックスラッシュを含む文字列の下に挿入する場合
\ を追加する

```
# 挿入したい文字列
LogFormat "time:%{%d/%b/%Y:%H:%M:%S %z}t\tx_forwarded_for:%{X-Forwarded-For}i\tremote_host:%h\trequest:%r\tlast_status:%s\tsize:%b\treferer:%{Referer}i\tuser_agent:%{User-Agent}i\tv_host:%{Host}i" ltsv

# 以下実装
sed -e '/LogFormat "%h %l %u %t \\"%r\\" %>s %b" common/a\    LogFormat "time:%{%d\/%b\/%Y:%H:%M:%S %z}t\\tx_forwarded_for:%{X-Forwarded-For}i\\tremote_host:%h\\trequest:%r\\tlast_status:%s\\tsize:%b\\treferer:%{Referer}i\\tuser_agent:%{User-Agent}i\\tv_host:%{Host}i" ltsv' /etc/httpd/conf/httpd.conf
```

・書式を残したまま特定の文字列だけ置換したい場合
文字列bbbをcccに置換する

```
aaa = "bbb"
```

```
sed -i 's/\(^aaa = \).*/\1"ccc"/g' ファイル名
```

# awk
$NFで末尾のフィールドを取り出す

```
awk '{print $NF}' <ファイル名>
```

末尾から数えてn番目を取り出す

```
awk '{print $(NF-n)}' <ファイル名>
```

# printf

```
printf 書式 値
```

```
[aaa]
command = "/usr/bin/bbb /var/log/httpd/access_log"
↑こんな感じの文字列を挿入する場合
```

```
printf "[%s]\ncommand = \"%s\"\n" "aaa" "/usr/bin/bbb /var/log/httpd/access_log"
```


```
[bbb]
command = ["ccc", "-p", "ddd"]
↑こんな感じの文字列を挿入する場合
```

```
printf "[%s]\ncommand = [%s]\\n" "bbb" '"ccc", "-p", "ddd"'
```

# mkdir
```
mkdir -p 指定されたディレクトリの上位ディレクトリも作成
      -m パーミッションを指定しディレクトリを作成
      -v ディレクトリを作成した結果のメッセージを表示

例：１度で３つのディレクトリを作成する場合 → mkdir -p dir1/dir2/dir3 
```

# date

```
# 現在の日時を表示
date
Thu Dec  3 05:24:17 UTC 2020

# フォーマットは + で始まる書式で指定
date "+%Y%m%d-%H%M%S"
20201203-052401

# 24時間後の日時を表示
$ date -d tomorrow
Fri Dec  4 05:24:32 UTC 2020

# -d の代わりに --date でも同じ
$ date --date tomorrow
Fri Dec  4 05:24:32 UTC 2020

# 30日後の日付を表示
date "+%Y/%m/%d" -d "30 days"
2021/01/02
```

# test

```
test -d ディレクトリであれば

# sampleがディレクトリであれば、なければsampleディレクトリ作成
test -d /sample || mkdir -p /sample
```

# tail

```
tail -f
```

# cron

```
# cronの設定
crontab -e

# 一覧表示
crontab -l

# 削除
crontab -r
```

秒単位でcronを実行

```
# 分・時・日・月・曜日 コマンド
* * * * * for i in `seq 0 15 59`;do (sleep ${i} ; sh /sample.sh) & done;
* * * * * for i in `seq 0 15 59`;do (sleep ${i} ; sh /home/deploy/sample.sh) & done;
```

１日１回0時0分に実行

```
0 0 * * * /path/to/sample.sh
```




# 正規表現

```
^cat    行頭がcatではなく、行頭がcで次がa、その次がtになっている文字列
$scat   行末がcatになっている文字列
ca[ta]a caの次がtかa、その次がaの文字列
[Cc]at  Cが大文字でも小文字でもいい
[^c]    行頭がc以外で始まる文字列

.  任意の１文字
[…]   リスト内任意の１文字
[^…]  リストに含まれていない任意の１文字
^     行頭
$     行末　
\<    行頭
\>    行末
|     または
?     任意の１回
+     少なくとも１回 ‘abc\+’の場合、「abc」が少なくとも１回必要
*     幾つでもOK
[a-zA-Z]{min, max}
```

# AWS CLI
AMI

```
# 最新AMIのID取得（Linux2）
aws ssm get-parameter \
--name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
--query "Parameter.Value" \
--region ap-northeast-1
```
S3

```
aws s3 ls
aws s3 cp アップロードしたいファイル名 ARN
```


# Vim

```
上に進む k
下に進む j
左に進む h
右に進む l
```

```
一番上に gg
一番下に G
```

```
先頭行 ^
行末   $
単語の先頭 B
単語の末尾 E
```

```
現在の行を削除 dd
カーソル以降削除 D
全削除 :%d
空白行削除 :v/./d
行コピー　yy
カーソルの場所にペースト p
カーソルの行をコピーし、下に１０行追加 yy10p
インサートモードから出る Ctl + c
```

```
# 検索 
esc → /検索したい文字入力 → Enter → 該当の文字に移動する
```

```
行コピー yy
貼り付け p
一つ前の作業に戻る u
```

```
# 行番号の表示
:set number

# 行番号の非表示
:set nonumber
```

```
検索一覧 :vim 検索文字入力 % | cw
```

Quickfix

```
次の検索 :cn
前の結果 :cp
閉じる  :ccl
```

```
行番号表示　:set number
非表示　   :set nonumber
```

# ターミナル

```
# 途中まで入力していたコマンドを全削除 
Ctrl + u

# 復元
Ctrl + y

# カーソル位置以降切り取り
Ctrl + k
　
# カーソル位置の文字削除
Ctrl + d 

# 移動
　↑ 「 Ctrl + p 」
　↓ 「 Ctrl + n 」
　→ 「 Ctrl + f 」
　← 「 Ctrl + b 」
```
# VSCODE
```
# ターミナルを開く
control + shift　+　`
上移動 control + p
下移動 control + n
```

# firewall-cmd
```
firewall-cmd --list-all

# 追加
firewall-cmd --add-service=mysql --permanent
firewall-cmd --add-port=22/tcp --permanent

# 削除
firewall-cmd --remove-service=mysql --permanent
firewall-cmd --remove-port=22/tcp --permanent

firewall-cmd --reload

# rich-rule追加
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.0" port protocol="tcp" port="22" accept"

# rich-rule削除
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.0.0" port port="22" protocol="tcp" accept"
```

# PDO 接続確認

```
<?php

const DB_HOST = 'mysql:mysql:host=hostname;dbname=dbname';
const DB_USER = 'user';
const DB_PASSWORD = 'pass';

try{
  $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD);
  echo '接続成功' . "\n";
} catch(PDOException $e){
  echo '接続失敗' . $e->getMessage() . "\n";
  exit();
}
```

まだまだ覚えることはあるので随時更新していきます。



yum list ~
yum list enabled
yum list installed
yum list available