Bash コマンド辞典

Bash コースで覚えるコマンドと構文の一覧です。cd・ls などの基本操作(pwd・cd・ls・mkdir・touch・cp・mv・rm・less・basename・date・diff・which)は最初から使えます。

basename / dirnameパスのファイル名部分・ディレクトリ部分いつでも使える

basename パス [拡張子]
dirname パス

パスから名前だけ、またはディレクトリだけを取り出します。

diff2 つのファイルの違いいつでも使える

diff ファイル1 ファイル2

< は 1 つ目だけ、> は 2 つ目だけにある行です。

break / continueくり返しを抜ける・次へいつでも使える

break [n]
continue [n]

for・while の中で使います。break でループを抜け、continue で次のくり返しへ進みます。

$1 $# $@ shiftスクリプトの引数いつでも使える

$0 $1 $2 … $# "$@"
shift [n]
set -- 値...

$0 はスクリプト名、$1 からが引数、$# は個数、"$@" は全部(1 つずつ別の語)。shift で 1 つずらします。終了コードは $? で見ます。

catファイルの中身を表示Lv1 で覚える

cat [-n] ファイル...

ファイルを連結して表示します。-n で行番号付き。

$ cat /etc/os-release

echo / printf文字を表示Lv1 で覚える

echo [-n] [-e] 文字列...
printf 書式 引数...

文字列を表示します。> ファイル と組み合わせるとファイルに書けます。

$ echo hello > memo.txt
$ echo 'line' >> memo.txt

head先頭の行を表示Lv2 で覚える

head [-n 行数] ファイル

既定は 10 行。-n 5 または -5 で行数を指定します。

$ head -n 3 /etc/passwd

tail末尾の行を表示Lv2 で覚える

tail [-n 行数] ファイル

ログの最新部分を見るのに使います。-n +2 で 2 行目以降。

$ tail -n 20 /var/log/messages

wc行数・単語数・バイト数を数えるLv2 で覚える

wc [-l] [-w] [-c] [ファイル]

-l で行数だけ。パイプと組み合わせて件数を数えます。

$ grep error app.log | wc -l

sort行を並べ替えるLv3 で覚える

sort [-n] [-r] [-u] [-k 列] [-t 区切り]

-n 数値順、-r 逆順、-u 重複を除く、-k 何列目で並べるか。

$ sort -nr counts.txt

uniq連続する重複行をまとめるLv3 で覚える

uniq [-c] [-d]

sort と組み合わせて使います。-c で回数付き。

$ sort access.log | uniq -c | sort -nr

cut列を切り出すLv4 で覚える

cut -d 区切り -f 列番号
cut -c 文字位置

区切り文字で分けた何列目かを取り出します。

$ cut -d: -f1 /etc/passwd

tr文字を置き換える・消すLv4 で覚える

tr 置換元 置換先
tr -d 消す文字

標準入力の文字を変換します。

$ echo hello | tr a-z A-Z

tee画面とファイルの両方に出すLv5 で覚える

tee [-a] ファイル

パイプの途中で内容をファイルに保存します。sudo tee で root 権限のファイルに書けます。

$ echo 'Listen 8080' | sudo tee -a /etc/httpd/conf/httpd.conf

xargs入力をコマンドの引数にするLv5 で覚える

xargs [-I {}] コマンド

パイプで受け取った一覧を、別のコマンドの引数として渡します。

$ find . -name '*.tmp' | xargs rm

export / env環境変数Lv6 で覚える

export 名前=値
env
echo $名前

env で一覧、echo $PATH のように参照します。

seq数の並びを出すLv6 で覚える

seq 終わり
seq 始め 終わり
seq 始め 増分 終わり
seq -s 区切り … / seq -w …

1 行に 1 つずつ数を出します。-s で区切り、-w で桁をそろえます。{1..10} のブレース展開でも同じことができます。

$ seq 5
$ seq -s, 1 3

grepパターンに合う行を探すLv8 で覚える

grep [-i] [-v] [-n] [-c] [-r] [-E] [-o] パターン [ファイル...]

-i 大文字小文字を区別しない、-v 合わない行、-n 行番号、-c 件数、-r 再帰、-E 拡張正規表現、-o 合った部分だけ。

$ grep -i error /var/log/messages
$ grep -rn Listen /etc/httpd

find条件に合うファイルを探すLv12 で覚える

find [場所] [-name パターン] [-type f|d] [-size +100M] [-mtime +7] [-user 名前] [-exec コマンド {} \;]

名前・種類・サイズ・更新日・所有者で探せます。-delete や -exec で見つけたものに処理もできます。

$ find /var/log -name '*.log' -size +100M
$ find ~ -type f -name '*.bak' -delete

awk列を取り出す・集計するLv14 で覚える

awk [-F 区切り] 'パターン { 処理 }' [ファイル]

$1 $2 は列、$NF は最後の列、NR は行番号。{ count[$1]++ } のように集計もできます。

$ awk '{print $1}' access.log
$ awk -F: '$3 >= 1000 {print $1}' /etc/passwd

sed文字列を置換・行を削除Lv21 で覚える

sed [-i] [-n] 's/前/後/g' [ファイル]
sed '/パターン/d'

-i でファイルを直接書き換えます。設定ファイルの一部を変えるときに便利。

$ sudo sed -i 's/^Listen 80$/Listen 8080/' /etc/httpd/conf/httpd.conf

chmod権限を変えるLv27 で覚える

chmod 755 ファイル
chmod u+x,go-w ファイル
chmod -R モード ディレクトリ

r=4 w=2 x=1 を所有者・グループ・その他の順に足した数字、または u/g/o と +-= で指定します。

$ chmod +x deploy.sh
$ chmod 600 secret.key

viテキストエディタLv27 で覚える

vi ファイル
sudo vi ファイル

i で入力、Esc で戻る、:wq で保存して終了、:q! で保存せずに終了。Vim コースで覚えた操作がそのまま使えます。

bash / sourceシェルスクリプトを実行Lv27 で覚える

bash スクリプト
./スクリプト(実行権限が必要)
bash -c 'コマンド'

./ で実行するには chmod +x が必要です。

[ ] / test / [[ ]]条件を調べるLv28 で覚える

[ "$a" -eq 1 ]
[ -f ファイル ]
[[ $s == *.log ]]
[[ $s =~ 正規表現 ]]

数値は -eq -ne -lt -le -gt -ge、文字列は = != -z(空)-n(空でない)、ファイルは -e -f -d -r -w -x -s。[[ ]] では == がパターン一致、=~ が正規表現、&& || が使えます。結果は終了コード(0 が真)。

$ [ -d /tmp ] && echo yes
$ [[ $name == a* ]] && echo match

if条件で分けるLv28 で覚える

if 条件; then …; elif 条件; then …; else …; fi

条件のコマンドの終了コードが 0 なら then を実行します。条件には [ ]、[[ ]]、(( ))、grep -q などのコマンドを書けます。

$ if [ $# -lt 1 ]; then echo usage; exit 1; fi

forくり返すLv29 で覚える

for 変数 in 値...; do …; done
for ((i=0; i<n; i++)); do …; done

値を 1 つずつ変数に入れてくり返します。in を省くと引数("$@")を順に。break で抜け、continue で次へ。

$ for f in *.log; do wc -l "$f"; done
$ for i in $(seq 3); do echo $i; done

while / until条件のあいだくり返すLv30 で覚える

while 条件; do …; done
until 条件; do …; done
while read -r line; do …; done < ファイル

条件が真のあいだ(until は偽のあいだ)くり返します。while read でファイルを 1 行ずつ処理するのが定番です。

$ i=0; while [ $i -lt 3 ]; do i=$((i+1)); done

read1 行読んで変数に入れるLv30 で覚える

read 変数...
IFS=区切り read -r a b
read -a 配列

標準入力から 1 行読みます。変数が複数なら空白(IFS)で分け、最後の変数に残り全部。-r でバックスラッシュをそのまま。読めないと終了コード 1。

$ while IFS=, read -r name age; do echo "$name"; done < users.csv

caseパターンで分けるLv31 で覚える

case 語 in パターン) …;; パターン|パターン) …;; *) …;; esac

語に合う最初のパターンの処理を実行します。パターンは * ? [ ] のワイルドカードと | の「または」。

$ case "$1" in start) echo start;; *) echo usage;; esac

$(( )) / (( )) / let / expr整数の計算Lv32 で覚える

$(( 式 ))
(( 式 ))
let 変数=式

+ - * / %(割り算は整数)、** べき乗、++ --、比較 == < >、&& ||、三項演算子 ? :。(( )) は結果が 0 以外なら真。変数は $ なしでも書けます。

$ echo $(( 7 / 2 ))
$ (( count++ ))
$ (( n > 10 )) && echo big

関数 name() { }処理に名前をつけるLv33 で覚える

name() { …; }
local 変数=値
return 終了コード

関数の中では引数が $1 $2 … $# になります。local で関数の中だけの変数。値を返すときは echo して $(name) で受け取ります。

$ greet() { echo "Hello, $1"; }; greet Taro

配列 / ${ } の展開値の並びと文字列の加工Lv34 で覚える

arr=(a b c)  ${arr[0]}  "${arr[@]}"  ${#arr[@]}  arr+=(d)
${v#パターン} ${v##…} ${v%…} ${v%%…}
${v/a/b} ${v//a/b} ${v^^} ${v,,} ${v:位置:長さ} ${#v} ${v:-既定値}

配列は 0 番から。# は前から、% は後ろから取り除き(2 つ重ねると最長一致)。/ は置き換え、^^ は大文字、,, は小文字、:- は空のときの既定値。

$ f=/var/log/app.log; echo ${f##*/} ${f%.log}

tarアーカイブの作成・展開Lv38 で覚える

tar czf 出力.tar.gz 対象...
tar xzf ファイル.tar.gz [-C 展開先]
tar tzf ファイル.tar.gz

c 作成、x 展開、t 一覧、z gzip 圧縮、f ファイル名、v 表示。

$ tar czf backup.tar.gz /etc/httpd

systemctlサービスの起動・停止・自動起動Lv39 で覚える

systemctl start|stop|restart|reload|status サービス
systemctl enable|disable [--now] サービス
systemctl is-active|is-enabled サービス
systemctl list-units --type=service [--failed]

start は今すぐ起動、enable は再起動後も自動で起動。enable --now で両方。操作には sudo が必要です。

$ sudo systemctl enable --now httpd
$ systemctl status sshd

curlURL にアクセスLv39 で覚える

curl [-I] [-s] [-o ファイル] URL

Web サーバーの動作確認に使います。-I でヘッダーだけ、-o でファイルに保存。

$ curl http://localhost/
$ curl -I http://localhost:8080/