Linuxコマンドやちょっとしたメモ 

## はじめに
Linux初心者の備忘録です。
学んだそばからすぐに忘れるので困っています。
「あ、また忘れてるわ_φ(･_･ﾒﾓﾒﾓ」ということがあれば追記していきます。

※ Ubuntu-20.04 を使用しています。

## echo
パイプ`|`やリダイレクト`>`と組み合わせると美味しくなる文字列を標準出力するコマンド。
 
#### 改行は出力したくない
`echo -n`

# ファイルやディレクトリの操作
## ls
#### ファイルとディレクトリを分けて表示する
`-F`

#### 【再帰的】サブディレクトリも含めた一覧を取得する
`-R`

#### ファイル種別がわかりやすく表示する
`ls -F`
@ : シンボリックリンク
\* : 実行ファイル


#### 隠しファイルも表示する

`ls -a`


#### ファイルのパーミッションを確認する

`ls -l`

#### 複数フォルダを同時に確認する

`ls /usr /etc`

#### ファイル名の始まりや終わりの一部文字列を指定して表示する
-  aから始まるファイルを表示する

`ls a*`

- .txtで終わるファイルを表示する

`ls *.txt`

## cp
#### ディレクトリの内容も含めてコピーする
`cp -r`

#### ファイル属性も含めてコピーする
`cp -a`


## シンボリックリンク
#### 作成する
`ln -s <リンク元 > <リンク先>`

#### 削除する
`rm`

## ディレクトリ
#### 深いディレクトリを一気に作成したい

`mkdir -p daily_report/2023/04`

#### 空のディレクトリを削除する。(ファイルがあればエラーになる)

`rmdir <ディレクトリ名>`


#### フォルダ内のファイルも含めて削除する。(書き込み権限のないファイルはエラーになる)

`rm -r <ディレクトリ名>`

#### フォルダ内のファイルも含めて削除する。(強制的)

`rm -rf <ディレクトリ名>`


## 複数ファイルを一気に移動したい
- 2023で始まるファイルを親フォルダに移動する

`mv 2023* ../ `

## ファイルの情報を表示する
#### ファイルの詳細情報を表示する
`stat` 

#### ファイルの形式を表示する
`file`

## ファイルを探す
- 現在のディレクトリ配下で「.txt」ファイルを探す
`find . -type f -name "*.txt"` 

- 上記コマンドで検索したファイルのパーミッションを確認する。(階層を超えて一覧化できる)   
`find . -type f -name "*.txt" | xargs ls -l` 

## アーカイブと圧縮
アーカイブ: 複数ファイルをまとめること
圧縮: 容量を小さくすること

#### アーカイブして圧縮する(gzip)
`tar -czf`

#### アーカイブを展開する。(圧縮の有無は自動判定)  
`tar -xf`

#### アーカイブファイルの内容を確認する
`tar -tf` 


# テキスト操作 
## cat
ファイルの内容を表示する。ファイルの内容を連結(concatenate)という用途もある。
#### 行番号を付けて表示する
`cat -n`

#### 複数ファイルを連結する
`cat ファイル1 ファイル2 ファイル3 > 連結ファイル`

## less

#### スクロールする

`j` # 1行下にスクロール
`k` # 1行上にスクロール
`f` # 1画面下にスクロール
`b` # 1画面上にスクロール


#### ファイル内で検索する

`/<検索したい文字列>` # 下方向に検索
`?<検索したい文字列>` # 上方向に検索
`n` # 次の検索結果に移動する
`N` # 前の検索結果に移動する

## head, tail
`head`, `tail`では先頭・末尾の10行を表示する

#### 行数の指定
`head/tail -数字`

## wc
ファイルの文字数/単語数/行数を表示する
#### 行数だけを表示する
`wc -l`

## grep
ファイルから文字列を含む行を表示する
#### ディレクトリ全体を対象に検索する
`grep -r 文字列 対象ディレクトリ`

#### 複数の文字列または正規表現で検索する
`grep -e 文字列1 -e 文字列2`

`grep -e 正規表現`

#### 指定した文字列を含まない行を検索する
``grep -v 文字列`

# コマンドライン入力操作

#### カーソル移動する

`Ctrl + b` # 後方に1文字
`Ctrl + f` # 前方に1文字
`Ctrl + a` # 行頭へ
`Ctrl + e` # 行末へ


#### 文字を削除する

`Ctrl + h` # BackSpaceキーと同様
`Ctrl + d` # Deleteキーと同様
`Ctrl + w` # 1単語ずつ後方削除 


#### コマンド履歴を使う

`Ctrl + p` # 1つ前のコマンド履歴へ
`Ctrl + n` # 次のコマンド履歴へ


#### コマンド履歴を検索する

`Ctrl + r`

## vim操作
#### カーソル移動する
`0` # 行の先頭 
`$` # 行の末尾
`G` # 最終行 
`指定行G` # 指定行へ移動
->※`:set number`で行番号を付与できる

#### 検索する
`/` # 下検索
`?` # 上検索 
検索結果の移動は、`n`または`N`

#### 削除する
`x` # カーソル位置の文字を削除する
その他、`d`の後に移動コマンドを組み合わせて削除ができる
`d$`, `d0`, `dw`など  
`dd` # カーソルのある行を削除

#### アンドゥ
`u`

## テキスト処理
## sed
文字列を編集して標準出力に出力する。元のファイルは変更されないためフィルタとして使える。 
「Stream Editor」

#### 行を削除する
`sed 1d <ファイル名>` # 1行目を削除する
`sed '3,$d' <ファイル名>` # 3行目から最終行まで削除する。`$`を利用する際は' 'で囲う必要がある
`sed /^a/d <ファイル名>` # aから始まる行を削除する

#### 行を置換する
- 大阪を東京に置換する。行の最初の文字列のみ置換の対象
`sed 's/Osaka/Tokyo/' <ファイル名>` 

- `g`フラグを付けると見つかったすべての文字列が置換される
`sed 's/Osaka/Tokyo/g' <ファイル名>`

- 「Osaka」を「/Osaka/」に置換する
    - 区切り文字は`/`である必要はない。sの後ろの文字が自動的に区切り文字になる
`sed 's!Osaka!/Osaka/!g' <ファイル名>`


## awk
「オーク」と発音する

#### フィールド(列)選択
- lsコマンドの結果から、5列目と9列目を表示する
`ls -l <ファイル名> | awk '{print $5,$9}'`

- 一番最後の列と、その1つ前の列を表示する
`ls -l <ファイル名> | awk '{print $(NF-1),$NF}'`

#### 正規表現で文字列のパターン指定
- `$9`(9列目)が「先頭がVB」にマッチする行を表示する
`ls -l <ファイル名> | awk '$9 ~ /^VB/ {print $5,$9}'`

- 先頭がl(つまりシンボリックリンク)の行を表示する
`ls -l <ファイル名> | awk '/^l/ {print $5,$9}'`

#### フィールドの区切り文字を指定する
- カンマ(,)を区切り文字として扱う場合
`awk -F,`

#### データで計算する
- 最終フィールドの値を合計する
`awk '{sum += $NF} END{print sum} <ファイル名>`

- 平均値を計算する
`awk -F, '{sum += $NF} END{print "Average:",sum/NR}' <ファイル名>`

#### awkスクリプトを保存して、再利用する
- 保存
上記の`{sum += $NF} END{print "Average:",sum/NR}`を`average.awk`で保存すると、

- 読み込み
`awk -f`  
-> ex.) `awk -F, -f average.awk <ファイル名>`



## suとsudo
`su` -> ユーザを切り替える。
`sudo` -> 一般ユーザがスーパーユーザとして**コマンドを実行するため**に使用する。 

## プロセスとジョブ
#### プロセス
メモリ上で実行状態にあるプログラムのこと。
`ps` # プロセスIDの確認
`kill <プロセスID>` # プロセスを終了させる

#### ジョブ
シェルのコマンドラインの1つの行が、1つのジョブにあたる。
`jobs`でジョブ番号が確認できる。
`kill %<ジョブ番号>` # ジョブを終了させる

#### 違い
プロセスは、Linuxカーネルから見た処理の単位であり、システム全体で一意のプロセスIDをもつ。
ジョブは、シェルごとの処理の単位で、複数のシェルからコマンドを打つとジョブ番号は重複しうる。

※まだ上手く言語化できておりません・・・。



## シェルスクリプト
#### #!bin/bash
ファイルの先頭が「#!」ならば、その後ろのコマンド(/bin/bash)を実行します、という宣言をしており、
Linuxカーネルは 


#### 実行方法の違い
1. `./sample.sh`
2. `bash ./sample.sh`
3. `source ./sample.sh`
4. `. ./sample.sh`

- 1のみシバンが必須
- 1と2は同じ動作
- 3と4は同じ動作
- 1と2はサブシェル(※)で実行されるが、3と4ではカレントシェルの中で実行されるためシェル環境の影響を受ける。また、元のシェルに影響をおよぼすことに注意が必要である。
- 
※ **サブシェル**: 現在のシェルから新しく起動される子プロセスのシェル。サブシェルは元のシェルとは別物である。環境変数は引き継がれますが、エイリアスなどの設定は引き継がれない。


## さいごに
今後も経験を積みながら更新していきます。