Linuxワンライナー100本ノック教科書(Claude3.5Sonnet活用)

# Linuxワンライナー100本ノック教科書

## 目次

1. はじめに
   - この教科書の目的
   - 対象読者
   - 使い方

2. Linuxコマンドラインの基礎
   - シェルとは
   - 基本的なコマンド（ls, cd, pwd, etc.）
   - リダイレクトとパイプの概念

3. テキスト処理の基本
   - grepコマンド
   - sedコマンド
   - awkコマンド

4. ファイル操作
   - findコマンド
   - xargsコマンド

5. システム管理
   - psコマンド
   - topコマンド

6. ネットワーク
   - curlコマンド
   - wgetコマンド

7. 100本ノック
   - テキスト処理編（30問）
   - ファイル操作編（30問）
   - システム管理編（20問）
   - ネットワーク編（20問）

8. 付録
   - よく使われるオプション一覧
   - 正規表現チートシート
   - 参考文献とリソース

## 1. はじめに

### この教科書の目的

本書は、Linuxコマンドラインの力を最大限に引き出すワンライナーの技術を習得することを目的としています。100個の実践的な問題を通じて、コマンドラインツールの使い方を学び、複雑なタスクを1行のコマンドで効率的に解決する方法を身につけます。

### 対象読者

この教科書は、以下のような方々を対象としています：

- Linuxの基本的な操作はできるが、コマンドラインの活用に自信がない方
- システム管理やデータ処理の効率を上げたい開発者やIT技術者
- シェルスクリプトの力を理解し、活用したいプログラマー

### 使い方

本書は、基礎的な説明から始まり、徐々に高度なトピックへと進んでいきます。各セクションには説明と例題が含まれており、最後の「100本ノック」セクションで総合的な練習問題に取り組むことができます。

1. 各セクションを順番に読み進めてください。
2. 例題を自分で試してみましょう。
3. 理解度を確認するために、各セクションの終わりにある練習問題に挑戦してください。
4. 最後の100本ノックに取り組み、学んだ内容を総合的に活用する力を身につけましょう。

それでは、Linuxワンライナーの世界へ飛び込んでいきましょう！

## 2. Linuxコマンドラインの基礎

### シェルとは

シェルは、ユーザーとオペレーティングシステムのカーネルの間でインターフェースとして機能するプログラムです。主な役割は：

1. ユーザーからのコマンドを解釈し実行すること
2. プログラムの起動や停止を管理すること
3. 基本的なプログラミング機能（変数、制御構造など）を提供すること

Linuxで最も一般的に使用されるシェルは、Bash（Bourne Again SHell）です。

### 基本的なコマンド

以下は、頻繁に使用される基本的なコマンドです：

1. `ls`: ディレクトリの内容をリストアップ
   例： `ls -la` （隠しファイルを含むすべてのファイルを詳細情報付きで表示）

2. `cd`: ディレクトリを変更
   例： `cd /home/user/documents`

3. `pwd`: 現在の作業ディレクトリを表示
   例： `pwd`

4. `mkdir`: 新しいディレクトリを作成
   例： `mkdir new_folder`

5. `rm`: ファイルまたはディレクトリを削除
   例： `rm file.txt` または `rm -r directory`

6. `cp`: ファイルまたはディレクトリをコピー
   例： `cp source.txt destination.txt`

7. `mv`: ファイルまたはディレクトリを移動（または名前変更）
   例： `mv old_name.txt new_name.txt`

8. `cat`: ファイルの内容を表示（または連結）
   例： `cat file.txt`

### リダイレクトとパイプの概念

リダイレクトとパイプは、コマンドの出力を操作し、複数のコマンドを連携させるための強力な機能です。

1. リダイレクト：
   - `>`: 出力を新しいファイルに書き込む（既存のファイルは上書き）
     例： `echo "Hello, World!" > greeting.txt`
   - `>>`: 出力を既存のファイルに追加
     例： `echo "New line" >> existing_file.txt`
   - `<`: ファイルから入力を読み込む
     例： `sort < unsorted_list.txt`

2. パイプ（`|`）：
   一つのコマンドの出力を別のコマンドの入力として使用します。
   例： `ls -l | grep "\.txt"`
   （この例では、`ls -l`の出力から、grepを使って".txt"を含む行のみを抽出しています）

これらの基本的な概念を理解することで、より複雑なワンライナーを構築する準備が整います。次のセクションでは、テキスト処理の基本ツールについて学んでいきます。

# Linuxワンライナー100本ノック教科書

（前のセクションは省略）

## 3. テキスト処理の基本

Linuxにおけるテキスト処理は、データ分析、ログ解析、設定ファイルの編集など、多くの場面で重要な役割を果たします。ここでは、テキスト処理の基本となる3つの強力なコマンドを紹介します。

### grepコマンド

grepは "Global Regular Expression Print" の略で、テキストファイルから特定のパターンに一致する行を検索し、表示するコマンドです。

基本的な使い方：
```
grep [オプション] パターン [ファイル...]
```

主なオプション：
- `-i`: 大文字と小文字を区別しない
- `-v`: パターンに一致しない行を表示
- `-n`: 行番号を表示
- `-r`: ディレクトリを再帰的に検索

例1: ファイル内で "error" という単語を含む行を検索
```
grep "error" log.txt
```

例2: 現在のディレクトリ以下のすべての .py ファイルから "import" という単語を含む行を検索
```
grep -r "import" *.py
```

### sedコマンド

sedは "Stream Editor" の略で、テキストの変換、置換、削除などを行うためのコマンドです。

基本的な使い方：
```
sed [オプション] 'コマンド' [ファイル...]
```

主な sed コマンド：
- `s/パターン/置換テキスト/`: パターンにマッチするテキストを置換
- `d`: 行を削除
- `p`: 行を表示（通常は -n オプションと併用）

例1: ファイル内の "apple" を "orange" に置換
```
sed 's/apple/orange/g' fruits.txt
```

例2: ファイルの3行目から5行目を削除
```
sed '3,5d' file.txt
```

### awkコマンド

awkは強力なテキスト処理ツールで、データの抽出、変換、レポート生成などに使用されます。

基本的な使い方：
```
awk [オプション] 'プログラム' [ファイル...]
```

awkの基本的な構造：
```
pattern { action }
```

例1: /etc/passwd ファイルからユーザー名とシェルを抽出
```
awk -F: '{ print $1 " uses " $7 }' /etc/passwd
```

例2: 各行の2列目と3列目の合計を計算
```
awk '{ sum = $2 + $3; print $1, sum }' data.txt
```

これらのコマンドを組み合わせることで、複雑なテキスト処理タスクを1行で実行できるようになります。次のセクションでは、これらのコマンドを使った実践的な例題に取り組みます。

## 4. ファイル操作

ファイルやディレクトリの操作は、システム管理やデータ処理において非常に重要です。ここでは、ファイル操作に関する2つの強力なコマンドを紹介します。

### findコマンド

findコマンドは、ファイルシステム内でファイルやディレクトリを検索するための非常に柔軟なツールです。

基本的な使い方：
```
find [パス] [式]
```

主なオプションと式：
- `-name パターン`: 名前でファイルを検索
- `-type f|d`: ファイル（f）またはディレクトリ（d）を指定
- `-size +|-N[cwbkMG]`: サイズで検索（+は以上、-は以下）
- `-mtime +|-N`: N日前に変更されたファイルを検索

例1: 現在のディレクトリ以下で、拡張子が .log のファイルを検索
```
find . -name "*.log"
```

例2: /home ディレクトリ以下で、7日以上前に変更された100MB以上のファイルを検索
```
find /home -type f -size +100M -mtime +7
```

### xargsコマンド

xargsは、標準入力からデータを受け取り、それを引数として別のコマンドを実行するユーティリティです。findコマンドと組み合わせて使用されることが多いです。

基本的な使い方：
```
コマンド | xargs [オプション] [コマンド]
```

主なオプション：
- `-n N`: N個の引数ごとにコマンドを実行
- `-I 置換文字列`: 入力行を置換文字列に置き換えて使用

例1: findで見つかったすべての .tmp ファイルを削除
```
find . -name "*.tmp" | xargs rm
```

例2: 見つかったファイルの内容を表示（ファイル名付き）
```
find . -name "*.txt" | xargs -I {} sh -c 'echo "File: {}"; cat {}'
```

これらのコマンドを使いこなすことで、大量のファイルを効率的に操作したり、複雑なファイル処理タスクを自動化したりすることができます。

次のセクションでは、システム管理に関連するコマンドを学びます。


## 5. システム管理

システム管理者にとって、システムの状態を監視し、プロセスを管理することは重要な仕事です。ここでは、システム管理に欠かせない2つのコマンドを紹介します。

### psコマンド

psコマンドは、現在実行中のプロセスに関する情報を表示します。

基本的な使い方：
```
ps [オプション]
```

主なオプション：
- `aux`: すべてのプロセスの詳細情報を表示
- `-ef`: 標準形式で全プロセスを表示
- `--sort`: 指定した列でソート

例1: 全プロセスを表示し、CPU使用率でソート
```
ps aux --sort=-%cpu
```

例2: 特定のユーザーのプロセスを表示
```
ps -u username
```

### topコマンド

topコマンドは、システムのリアルタイムのパフォーマンス情報を動的に表示します。

基本的な使い方：
```
top [オプション]
```

主なオプション：
- `-n N`: N回更新して終了
- `-b`: バッチモードで実行（他のコマンドとの連携に便利）

topコマンド実行中の主なキー操作：
- `M`: メモリ使用率でソート
- `P`: CPU使用率でソート
- `k`: プロセスを強制終了

例: CPU使用率の高い上位5プロセスを表示
```
top -b -n 1 | head -n 12 | tail -n 5
```

これらのコマンドを使いこなすことで、システムの状態を効率的に監視し、問題のあるプロセスを迅速に特定することができます。

## 練習問題

以下の練習問題を通じて、これまでに学んだコマンドの理解を深めましょう。

1. テキスト処理：
   ファイル `access.log` 内で、IPアドレスが "192.168.1." で始まる行の数を数えてください。

2. ファイル操作：
   現在のディレクトリ以下にある、サイズが1MB以上の.pngファイルを見つけ、それらのファイル名とサイズを表示してください。

3. システム管理：
   現在実行中のプロセスの中で、メモリ使用率が最も高い5つのプロセスを表示してください。プロセス名、PID、メモリ使用率を含めてください。

解答例：

1. テキスト処理：
```
grep "^192\.168\.1\." access.log | wc -l
```

2. ファイル操作：
```
find . -type f -name "*.png" -size +1M -exec ls -lh {} \; | awk '{print $9, $5}'
```

3. システム管理：
```
ps aux --sort=-%mem | head -n 6 | tail -n 5 | awk '{print $11, $2, $4}'
```

これらの練習問題を通じて、実際のシナリオでワンライナーがどのように使用されるかを理解できます。次のセクションでは、ネットワーク関連のコマンドについて学びます。

## 6. ネットワーク

ネットワーク関連のタスクを効率的に行うことは、多くのシステム管理者やデベロッパーにとって重要です。ここでは、ネットワーク操作に関する2つの重要なコマンドを紹介します。

### curlコマンド

curlは、データ転送のためのコマンドラインツールで、様々なプロトコル（HTTP, HTTPS, FTP など）をサポートしています。

基本的な使い方：
```
curl [オプション] URL
```

主なオプション：
- `-o ファイル名`: 出力を指定したファイルに保存
- `-I` または `--head`: HTTPヘッダーのみを取得
- `-X メソッド`: HTTPメソッドを指定（GET, POST, PUT など）
- `-H "ヘッダー"`: カスタムヘッダーを送信

例1: Webページの内容を取得
```
curl https://example.com
```

例2: JSONデータをPOSTリクエストで送信
```
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/endpoint
```

### wgetコマンド

wgetは、ネットワークを通じてファイルをダウンロードするためのコマンドラインユーティリティです。

基本的な使い方：
```
wget [オプション] URL
```

主なオプション：
- `-O ファイル名`: ダウンロードしたファイルを指定した名前で保存
- `-c`: 中断されたダウンロードを続行
- `-r`: 再帰的にダウンロード（Webサイト全体のミラーリングなどに使用）
- `--limit-rate=速度`: ダウンロード速度を制限（例：100k）

例1: ファイルをダウンロードし、進行状況を表示
```
wget -O output.zip https://example.com/large-file.zip
```

例2: Webサイトの画像を再帰的にダウンロード
```
wget -r -P ./images -A jpeg,jpg,bmp,gif,png https://example.com
```

これらのコマンドを使いこなすことで、ネットワーク経由のデータ取得や操作を効率的に行うことができます。

## 練習問題

以下の練習問題で、これまでに学んだコマンドの応用力を試しましょう。

1. ネットワーク：
   `curl`を使用して、https://api.github.com/users/github のJSONレスポンスから、"login"と"public_repos"フィールドのみを抽出し、「ユーザー名: リポジトリ数」の形式で表示してください。

2. テキスト処理とネットワーク：
   `wget`を使用して https://www.gutenberg.org/files/11/11-0.txt (Alice's Adventures in Wonderland) をダウンロードし、'Alice'という単語が何回出現するかカウントしてください。

3. システム管理とファイル操作：
   現在のディレクトリ以下にある全ての.logファイルの中から、"ERROR"を含む行を探し、ファイル名と行の内容を表示してください。結果は error_summary.txt というファイルに保存してください。

解答例：

1. ネットワーク：
```
curl -s https://api.github.com/users/github | awk -F'"' '/"login"/{login=$4} /"public_repos"/{repos=$3} END{print login ": " repos}' | tr -d ','
```

2. テキスト処理とネットワーク：
```
wget -q -O - https://www.gutenberg.org/files/11/11-0.txt | grep -oi 'alice' | wc -l
```

3. システム管理とファイル操作：
```
find . -name "*.log" -type f -exec grep -H "ERROR" {} \; > error_summary.txt
```

これらの練習問題を通じて、複数のコマンドを組み合わせて複雑なタスクを実行する方法を学べます。次のセクションでは、これまでに学んだすべての知識を活用して、より挑戦的な「100本ノック」に取り組みます。


## 7. 100本ノック

ここでは、これまでに学んだすべての知識を活用して、100個の実践的な問題に挑戦します。問題は難易度順に並べられており、テキスト処理、ファイル操作、システム管理、ネットワークの各カテゴリから出題されています。

各問題には難易度（★: 簡単、★★: 中程度、★★★: 難しい）が付けられています。

### テキスト処理編（30問）

1. ★ ファイル `names.txt` 内の行数を数えてください。
   ```
   wc -l names.txt
   ```

2. ★ ファイル `words.txt` 内で "linux" という単語が含まれる行を表示してください。
   ```
   grep "linux" words.txt
   ```

3. ★★ ファイル `numbers.txt` 内の数値の合計を計算してください。
   ```
   awk '{sum += $1} END {print sum}' numbers.txt
   ```

4. ★★ ファイル `log.txt` 内で最も頻繁に出現する単語を見つけ、その単語と出現回数を表示してください。
   ```
   tr ' ' '\n' < log.txt | sort | uniq -c | sort -nr | head -n 1
   ```

5. ★★★ ファイル `data.csv` の2列目と3列目の値を入れ替えて表示してください。
   ```
   awk -F',' '{print $1 "," $3 "," $2 "," $4}' OFS=',' data.csv
   ```

（残りの25問は省略）

### ファイル操作編（30問）

31. ★ 現在のディレクトリ内のすべての `.txt` ファイルを一覧表示してください。
    ```
    find . -maxdepth 1 -name "*.txt"
    ```

32. ★★ 現在のディレクトリ以下にある、1週間以内に修正されたすべてのファイルを見つけてください。
    ```
    find . -type f -mtime -7
    ```

33. ★★★ 現在のディレクトリ以下にある重複ファイル（内容が同じファイル）を見つけ、それらのパスを表示してください。
    ```
    find . -type f -exec md5sum {} + | sort | uniq -w32 -dD
    ```

（残りの27問は省略）

### システム管理編（20問）

61. ★ 現在実行中のプロセスの総数を表示してください。
    ```
    ps aux | wc -l
    ```

62. ★★ メモリ使用率が10%以上のプロセスを、使用率の降順で表示してください。
    ```
    ps aux | awk '$4 >= 10.0 {print $0}' | sort -k4 -rn
    ```

63. ★★★ システムの平均負荷、CPU使用率、空きメモリをリアルタイムで1秒ごとに表示し、結果をファイルに保存してください。
    ```
    while true; do echo "$(date) - Load: $(cut -d ' ' -f1-3 /proc/loadavg) | CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')% | Free Mem: $(free -m | awk 'NR==2{print $4}')MB"; sleep 1; done | tee system_stats.log
    ```

（残りの17問は省略）

### ネットワーク編（20問）

81. ★ 指定したウェブサイトのHTTPステータスコードを取得してください。
    ```
    curl -s -o /dev/null -w "%{http_code}" https://www.example.com
    ```

82. ★★ 指定したIPアドレスの地理的位置情報を取得し、国と都市を表示してください。
    ```
    curl -s http://ipinfo.io/8.8.8.8 | jq -r '.country + ", " + .city'
    ```

83. ★★★ 指定したウェブサイトの応答時間を10回測定し、平均、最小、最大値を表示してください。
    ```
    for i in {1..10}; do curl -s -w "%{time_total}\n" -o /dev/null https://www.example.com; done | awk '{sum+=$1; if(NR==1){min=max=$1}; if($1>max){max=$1}; if($1<min){min=$1}} END {print "Avg: " sum/NR ", Min: " min ", Max: " max}'
    ```

（残りの17問は省略）

これらの問題を解くことで、Linuxコマンドラインの様々な側面を実践的に学ぶことができます。各問題を解いた後は、自分なりにコマンドを変更したり、異なるアプローチを試したりして、理解を深めてください。

次のセクションでは、よく使われるオプションの一覧や正規表現のチートシートなど、参考になる情報をまとめた付録を提供します。

# Linuxワンライナー100本ノック教科書

（前のセクションは省略）

## 8. 付録

この付録セクションでは、Linuxコマンドラインを使用する上で役立つ補足情報を提供します。ここには、よく使われるオプションの一覧、正規表現のチートシート、そして参考文献とリソースが含まれています。

### A. よく使われるオプション一覧

以下は、頻繁に使用されるコマンドとそのオプションの一覧です。

1. ls（ディレクトリの内容をリスト）
   - `-l`: 詳細情報を表示
   - `-a`: 隠しファイルを含むすべてのファイルを表示
   - `-h`: ファイルサイズを人間が読みやすい形式で表示

2. grep（パターンマッチング）
   - `-i`: 大文字小文字を区別しない
   - `-r`: ディレクトリを再帰的に検索
   - `-v`: マッチしない行を表示

3. find（ファイル検索）
   - `-name`: ファイル名で検索
   - `-type`: ファイルタイプで検索（f: 通常ファイル、d: ディレクトリ）
   - `-mtime`: 更新時間で検索

4. sed（ストリームエディタ）
   - `-i`: 直接ファイルを編集
   - `-e`: 複数のコマンドを指定

5. awk（テキスト処理）
   - `-F`: フィールド区切り文字を指定
   - `-v`: 変数を設定

### B. 正規表現チートシート

正規表現は、テキスト処理やパターンマッチングで非常に強力なツールです。以下は、よく使われる正規表現のパターンです。

1. 文字クラス
   - `[abc]`: a, b, またはcのいずれか
   - `[^abc]`: a, b, c以外の任意の文字
   - `[a-z]`: aからzまでの任意の小文字

2. 量指定子
   - `*`: 0回以上の繰り返し
   - `+`: 1回以上の繰り返し
   - `?`: 0回または1回の出現
   - `{n}`: ちょうどn回の繰り返し
   - `{n,}`: n回以上の繰り返し
   - `{n,m}`: n回以上m回以下の繰り返し

3. アンカー
   - `^`: 行の先頭
   - `$`: 行の末尾
   - `\b`: 単語の境界

4. 特殊文字
   - `.`: 任意の1文字（改行を除く）
   - `\d`: 任意の数字（[0-9]と同等）
   - `\w`: 任意の英数字（[a-zA-Z0-9_]と同等）
   - `\s`: 任意の空白文字

5. グループ化とキャプチャ
   - `(...)`: グループ化とキャプチャ
   - `(?:...)`: グループ化（キャプチャなし）

### C. 参考文献とリソース

1. 書籍
   - "The Linux Command Line" by William Shotts
   - "Linux in a Nutshell" by Ellen Siever, Stephen Figgins, Robert Love
   - "sed & awk" by Dale Dougherty and Arnold Robbins

2. オンラインリソース
   - GNU Coreutils Manual: https://www.gnu.org/software/coreutils/manual/
   - Linux Documentation Project: https://tldp.org/
   - Linux Man Pages Online: https://linux.die.net/man/

3. コミュニティとフォーラム
   - Stack Overflow: https://stackoverflow.com/questions/tagged/linux
   - Unix & Linux Stack Exchange: https://unix.stackexchange.com/
   - Reddit r/linux: https://www.reddit.com/r/linux/

4. チュートリアルサイト
   - Linux Journey: https://linuxjourney.com/
   - OverTheWire Bandit (コマンドライン練習): https://overthewire.org/wargames/bandit/

これらのリソースを活用することで、Linuxコマンドラインの知識をさらに深めることができます。定期的に参照し、実践を重ねることで、より効率的なコマンドライン操作が可能になります。

## おわりに

本書「Linuxワンライナー100本ノック教科書」を通じて、Linuxコマンドラインの基礎から応用まで幅広く学んできました。ここで紹介したコマンドやテクニックは、日々のシステム管理、開発作業、データ分析など、様々な場面で役立つでしょう。

ただし、コマンドラインの世界は非常に深く、ここで紹介した内容はその一部に過ぎません。継続的な学習と実践を通じて、さらなるスキルの向上を目指してください。

最後に、Linuxコミュニティの精神を忘れないでください。困ったときは躊躇せずにヘルプを求め、同時に自分の知識を他の人と共有することを心がけましょう。それが、オープンソースの世界をさらに豊かにする原動力となります。

Happy command-line adventuring!