この記事の要点
• grep・sed・awkのテキスト処理三銃士を使いこなす
• 変数展開・制御構文・リダイレクトの基本構文
• set -eとset -uで安全なシェルスクリプトを書く
基本コマンド
ファイル操作
# 一覧表示
ls # 基本
ls -la # 詳細(隠しファイル含む)
ls -lh # 人間が読みやすいサイズ
# ディレクトリ移動
cd /path/to/dir
cd ~ # ホームディレクトリ
cd - # 前のディレクトリ
cd .. # 親ディレクトリ
# ファイル操作
cp file1 file2 # コピー
cp -r dir1 dir2 # ディレクトリコピー
mv file1 file2 # 移動/リネーム
rm file # 削除
rm -rf dir # ディレクトリ削除(強制)
mkdir dir # ディレクトリ作成
mkdir -p a/b/c # 親ディレクトリも作成
# ファイル内容
cat file # 全表示
head -n 10 file # 先頭10行
tail -n 10 file # 末尾10行
tail -f file # リアルタイム監視
less file # ページャー
ポイント: grep・sed・awkはBashの三大テキスト処理ツール。パイプで組み合わせることで強力なデータ加工ができます。
テキスト処理
# 検索
grep "pattern" file
grep -r "pattern" dir # 再帰検索
grep -i "pattern" file # 大文字小文字無視
grep -n "pattern" file # 行番号表示
grep -v "pattern" file # 除外
# 置換
sed 's/old/new/' file # 最初の1つ
sed 's/old/new/g' file # 全て置換
sed -i 's/old/new/g' file # ファイル直接編集
# カラム抽出
awk '{print $1}' file # 1列目
awk -F: '{print $1}' file # 区切り文字指定
cut -d: -f1 file # 区切り文字と列
# ソート
sort file
sort -n file # 数値ソート
sort -r file # 逆順
sort -u file # 重複除去
# 重複
uniq file # 連続した重複を除去
sort file | uniq # 全重複を除去
uniq -c file # 出現回数カウント
# カウント
wc -l file # 行数
wc -w file # 単語数
wc -c file # バイト数
ファイル検索
# find
find . -name "*.txt" # 名前で検索
find . -type f -name "*.log" # ファイルのみ
find . -type d -name "src" # ディレクトリのみ
find . -mtime -7 # 7日以内に更新
find . -size +100M # 100MB以上
find . -name "*.tmp" -delete # 削除
# locate(インデックス検索)
locate filename
注意: rm -rfは取り消しできません。必ず対象パスを確認してから実行しましょう。特に変数展開と組み合わせる場合は要注意です。
変数
# 変数
name="Alice"
echo $name
echo ${name}
# 環境変数
export PATH="$PATH:/new/path"
export NODE_ENV=production
### 特殊変数
| 変数 | 説明 |
|---|---|
| `$0` | スクリプト名 |
| `$1` | 第1引数 |
| `$@` | 全引数(個別) |
| `$*` | 全引数(まとめて) |
| `$#` | 引数の数 |
| `$?` | 直前のコマンドの終了ステータス |
| `$$` | プロセスID |
| `$!` | 最後のバックグラウンドプロセスID |
### 文字列操作
| 構文 | 説明 |
|---|---|
| `${var:-default}` | 未定義ならデフォルト値 |
| `${var:=default}` | 未定義なら代入 |
| `${#var}` | 文字列長 |
| `${var#pattern}` | 先頭からパターン削除(最短) |
| `${var##pattern}` | 先頭からパターン削除(最長) |
| `${var%pattern}` | 末尾からパターン削除(最短) |
| `${var%%pattern}` | 末尾からパターン削除(最長) |
| `${var/old/new}` | 置換(最初の1つ) |
| `${var//old/new}` | 置換(全て) |
実践メモ: ${var:-default}構文を使えば、未定義変数にデフォルト値を設定できます。スクリプトの堅牢性が大幅に向上します。
制御構文
条件分岐
# if文
if [ "$name" = "Alice" ]; then
echo "Hello Alice"
elif [ "$name" = "Bob" ]; then
echo "Hello Bob"
else
echo "Hello stranger"
fi
### 条件演算子
#### 文字列
| 演算子 | 説明 |
|---|---|
| `[ "$a" = "$b" ]` | 等しい |
| `[ "$a" != "$b" ]` | 等しくない |
| `[ -z "$a" ]` | 空文字 |
| `[ -n "$a" ]` | 空でない |
#### 数値
| 演算子 | 説明 |
|---|---|
| `[ $a -eq $b ]` | 等しい |
| `[ $a -ne $b ]` | 等しくない |
| `[ $a -lt $b ]` | より小さい |
| `[ $a -le $b ]` | 以下 |
| `[ $a -gt $b ]` | より大きい |
| `[ $a -ge $b ]` | 以上 |
#### ファイル
| 演算子 | 説明 |
|---|---|
| `[ -e file ]` | 存在する |
| `[ -f file ]` | ファイルである |
| `[ -d dir ]` | ディレクトリである |
| `[ -r file ]` | 読み取り可能 |
| `[ -w file ]` | 書き込み可能 |
| `[ -x file ]` | 実行可能 |
#### 論理演算
| 演算子 | 説明 |
|---|---|
| `[ cond1 ] && [ cond2 ]` | AND |
| `[ cond1 ] \|\| [ cond2 ]` | OR |
| `! [ cond ]` | NOT |
#### [[ ]] の使用(拡張テスト)
| 演算子 | 説明 |
|---|---|
| `[[ $name == A* ]]` | パターンマッチ |
| `[[ $name =~ ^A.*$ ]]` | 正規表現 |
ループ
# for
for i in 1 2 3 4 5; do
echo $i
done
for i in {1..10}; do
echo $i
done
for file in *.txt; do
echo $file
done
for ((i=0; i<10; i++)); do
echo $i
done
# while
while [ $count -lt 10 ]; do
echo $count
((count++))
done
# ファイル読み込み
while read line; do
echo $line
done < file.txt
case
case $option in
start)
echo "Starting..."
;;
stop)
echo "Stopping..."
;;
restart)
echo "Restarting..."
;;
*)
echo "Unknown option"
;;
esac
関数
# 関数定義
greet() {
local name=$1
echo "Hello, $name!"
return 0
}
# 呼び出し
greet "Alice"
# 戻り値の取得
result=$(greet "Alice")
status=$?
ポイント: パイプ(|)とリダイレクト(>)はBashの最も重要な概念。コマンドを繋げてデータを流す仕組みを理解しましょう。
リダイレクト・パイプ
| コマンド | 説明 |
|---|---|
command > file | 出力リダイレクト(上書き) |
command >> file | 出力リダイレクト(追記) |
command 2> file | 標準エラーリダイレクト |
command &> file | 両方リダイレクト |
command < file | 入力リダイレクト |
command1 | command2 | パイプ |
ls | grep "txt" | wc -l | パイプ連結 |
diff <(command1) <(command2) | プロセス置換 |
Here Document
cat << EOF
複数行の
テキスト
EOF
便利なテクニック
| コマンド | 説明 |
|---|---|
date=$(date +%Y%m%d) | コマンド置換 |
files=$(ls *.txt) | コマンド置換(ファイル一覧) |
((result = 5 + 3)) | 算術演算 |
result=$((5 + 3)) | 算術演算(代入) |
command & | バックグラウンド実行 |
nohup command & | ログアウト後も継続 |
command1 && command2 | 成功時のみ次を実行 |
command1 || command2 | 失敗時のみ次を実行 |
command1 ; command2 | 常に両方実行 |
find . -name "*.txt" | xargs grep "pattern" | xargs(検索) |
find . -name "*.tmp" | xargs rm | xargs(削除) |
command | tee file | 画面とファイル両方に出力 |
注意: [ ]と[[ ]]は異なります。拡張テストの[[ ]]はBash固有で、パターンマッチや正規表現が使えます。POSIX互換が必要なら[ ]を使いましょう。
実践メモ: xargsとfindの組み合わせは頻出パターン。find . -name "*.txt" | xargs grep "pattern"で大量ファイルの一括検索ができます。
シェルスクリプト例
#!/bin/bash
set -e # エラーで停止
set -u # 未定義変数でエラー
# 引数チェック
if [ $# -lt 1 ]; then
echo "Usage: $0 <filename>"
exit 1
fi
# ファイル存在チェック
if [ ! -f "$1" ]; then
echo "File not found: $1"
exit 1
fi
# 処理
echo "Processing $1..."
参考リソース
- GNU Bash Manual - Bash 公式リファレンスマニュアル
- Bash Reference Manual (PDF/HTML) - GNU 公式ドキュメント一覧
- Bash man page - Linux man-pages プロジェクトの bash(1)
- Advanced Bash-Scripting Guide - TLDP の詳細ガイド
関連記事
- Gitチートシート - Git操作
- Dockerチートシート - Docker操作
- Linux基礎 - Linux入門