学習メモ

## メモ
CPU
```
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0    268 353500  81660 2868132    0    0    40    79  203  102  0  5 94  0  0
```
CPUの使用時間は、100-id(アイドル時間)%


メモリ
（参考：https://milestone-of-se.nesuke.com/sv-basic/linux-basic/free-command/）
```
$ free
               total        used        free      shared  buff/cache   available
Mem:         4010516      694612     1000900       24992     2315004     3003628
Swap:        2191356         268     2191088

$ free -wlt
               total        used        free      shared     buffers       cache   available
Mem:         4010516      693736      994204       24992       63676     2258900     3004496
Low:         4010516     3016312      994204
High:              0           0           0
Swap:        2191356         268     2191088
Total:       6201872      694004     3185292
```
空き容量は、free + buff + cache として計算

SWAP領域
・ストレージ上に作られる仮想メモリ
・メモリが不足した時に予約済のSWAP領域をメモリとして使用
・メモリのDRAMに比べると速度は遅い

|カラム|説明|
|:--:|:--|
|total|マシンに搭載したメモリ総量|
|used|割り当て済みのメモリ消費量|
|free|利用されていないメモリ容量|
|shared|共有メモリの容量|
|buff|カーネルバッファ（メモリ上のデータを目倍す送受信する領域）|
|cache|ページキャッシュ、スラブキャッシュ（高速化のためのキャッシュ）|
|available|実質すぐに割り当てが可能なメモリ（free + buff/cacheの解放可能領域）|


タイムスタンプ（mtime）のフォーマットを指定
```
$ ls -l --time-style="+%Y/%m/%d %H:%M:%S" /home/user/test
-rw-r--r--. 1 user user 9708 2024/09/01 12:34:56 /home/user/test
```

詳細なタイムスタンプ
```
stat /home/user/test
```

ファイルを空にする
```
$ cp /dev/null /home/user/test

$ : > /home/user/test
```

数列
```
$ seq 3
1
2
3

$ seq 2 4
2
3
4

$ seq 1 2 5
1
3
5

$ seq -s" " 3    (区切り文字指定、デフォルトは改行）
1 2 3

$ seq -f "%02g" 5    （桁指定）
01
02
03
04
05


```


何日差か
```
$ TODAY_UNIX_TIME=`date -d 2024/09/02 +%s`
$ YESTERDAY_UNIX_TIME=`date -d 2024/09/01 +%s`
$ BETWEEN="$(((TODAY_UNIX_TIME - YESTERDAY_UNIX_TIME) / 86400))"
$ echo $BETWEEN
1
```

if文
```
if [ 条件式1 ] || [ 条件式2 ]; then
        echo "1,2"
elif [ 条件式3 ] && [ 条件式4]; then
        echo "3,4"
else
        echo "5"
fi
======================================
$ if [] 


```

#### 条件式
数値
|条件式||説明|
|:--:|:--:|:--|
|A -eq B|=|AとBが等しいなら|
|A -ne B|!=|AとBが等しくないなら|
|A -gt B|>|AがBより大きいなら|
|A -ge B|>=|AがB以上なら|
|A -lt B|<|AがBより小さいなら|
|A -le B|<=|AがB以下なら|

文字列
|条件式|説明|
|:--:|:--|
|A = B|AとBが等しいなら|
|A != B|AとBが等しくないなら|

長さ
|条件式|説明|
|:--:|:--|
|-z A|Aの長さが0なら|
|-n A|Aの長さが0より大きいなら|

属性
|条件式|説明|
|:--:|:--|
|-e A|Aが存在するなら|
|-s A|Aのファイルサイズが0より大きいなら||
|-f A|Aがファイルなら|
|-d A|Aがディレクトリなら|
|-r A|Aが読み取り可能なら|
|-w A|Aが書き込み可能なら|
|-x A|Aが実行可能なら|



引数でfor文を回す
```
for I; do
    echo "$I"
done

=================
$ for i in {1..3};do echo $i;done
1
2
3

$ for file in `ls`;do echo $file;done
aaa.txt
bbb.csv
ccc.sh
```




縦を横に
```
$ cat /home/user/test
aaa
bbb

$ cat /home/user/test | xargs
aaa bbb
```

## awk
デリミタ指定
```
$echo "2024/09/01" | awk -F "/" '{print $2}'
09
```

最後のフィールド
```
$ echo "1 2 3 4 5 6" | awk '{print $NF}'
6
```

行の操作
```
$ seq 5 |awk 'NR <= 3'
1
2
3

$ seq 7 | awk 'NR % 2 == 1 && NR <= 5'
1
3
5
```
三項演算子
```
$ echo "1 2" | awk '{print $1<$2 ? "<" : ">"}'
<
```

切り出し
```
$ echo "2024/09/01" | awk '{print substr($1,4)}'
4/09/01

$ echo "2024/09/01" | awk '{print substr($1,4,4)}'
4/09
```

パターン検索
```
$ echo "2024/09/01" | awk 'match($0, /\/09/) {print RSTART, RLENGTH}'
5 3
```

フィールド変更
```
$ echo "1 2 3 4 5 6 7 8" | awk '{$3 = "a"; print}'
1 2 a 4 5 6 7 8
```

置換
```
$ echo "2024/09/01" | awk '{sub("0","a");print $0}'
2a24/09/01

$ echo "2024/09/01" | awk '{gsub("0","a");print $0}'
2a24/a9/a1
```



## sed