Linux/UNIXのコマンドは単独で使うよりも、複数のコマンドを組み合わせてこそ真価を発揮します。テキストデータの検索/置換/並べ替え、ファイルのバックアップや削除、数値や日付の計算など活用範囲は無限大。端末にコマンドを入力してすぐに実行できるのも良いところ。その場かぎりの作業にこそ、シェルプログラミングが使えると便利です。
本書のいくつもの実例を順に見ていけば、コマンドを自在に組み合わせるために必要なシェルの機能と考え方が身につきます。
※本書はSoftwareDesign誌(技術評論社刊)の連載記事「開眼シェルスクリプト」を大幅に加筆修正し、同社から発行されたものです。
1.1.1 McIlroyによるパイプの提案
1.1.2 grep,sedの誕生
1.1.3 「ソフトウェアツール」という言葉の誕生
1.1.4 考えられた「もう1つの選択肢」
1.1.5 GancarzのUNIX哲学
1.2.1 想定する利用シーン
1.2.2 Ubuntu 14.04 LTS
1.3.1 端末とシェルを開く
1.3.2 シェルにコマンドを入力する
1.3.3 manを使う
1.3.4 ファイルやコマンドの出力を眺める
1.3.5 ディレクトリを理解する
1.3.6 ディレクトリを移動する
1.3.7 ワイルドカードで一度に複数ファイルを指定する
1.3.8 パイプでコマンドをつなぐ
1.3.9 シェルスクリプトを書いて実行する
1.3.10 ファイルを読み書きする
1.3.11 出力を捨てる
1.3.12 日本語と英語を切り替える(ロケール)
1.3.13 パーミッションを理解する
1.3.14 制御構文を使う
1.3.15 その他の文法
1.4.1 AWKを使う
1.4.2 sedを使う
1.5.1 GNU Awkの確認/インストール
1.5.2 Open usp Tukubaiのインストール
2.1.1 文字列を検索する
2.1.2 複数のファイルから検索する
2.1.3 調査したいファイル一覧を作ってから検索する
2.1.4 ファイル名を検索する
2.1.5 検索対象の前後の行を抽出する
2.1.6 検索語句を含むファイルのリストを作る
2.2.1 文字数を数える
2.2.2 単語や語句を数える
2.2.3 文字の出現頻度を数える
2.2.4 斉藤さんの数を数える
2.3.1 2つのテキストファイルを比較する
2.3.2 ディレクトリのファイルを比較する
2.3.3 ファイルが同じだったら/違ったら××する
2.4.1 特定の語句を置き換える
2.4.2 複数のファイルで特定の語句を置き換える
2.4.3 表記揺れや記号の不統一をチェックする
2.4.4 スペルチェックを行う
2.4.5 変なバイナリが混入していないか調査する
2.4.6 長い行を折り返す
2.4.7 不必要なマークアップ/コメント/スペースを消す
2.4.8 マークアップ/スペースをあとから差し込む
2.4.9 特定のフォーマットにデータを流し込む
2.5.1 Vimでコマンドを使う
2.5.2 カタカナや数字の全角/半角を相互変換する
3.1.1 ディレクトリをバックアップする
3.1.2 2つのディレクトリを同期する
3.1.3 最新ファイルを古いファイルで上書きしないように同期を行う
3.2.1 gzip圧縮されたファイルを圧縮されたまま使う
3.2.2 アーカイブの中から特定のファイルだけを抜き出す
3.3.1 重複したファイルを消す
3.3.2 ディレクトリの古いファイルを整理する
3.3.3 複数のテキストファイルを圧縮しないで1つにまとめる
3.4.1 ファイルを公開鍵暗号方式で暗号化する
3.4.2 パスワード方式の暗号化を行う/破る
3.5.1 プログラムを定期的に自動実行する
3.5.2 ファイルが変更されたらアクションを起こす
3.5.3 service(1)で自作のプログラムを起動/停止する
3.5.4 OS起動時に自作のプログラムを走らせる
3.6.1 検索する
3.6.2 日付を正規化する
3.6.3 Apacheのログ(不定長データ)をスペース区切りに整形する
3.6.4 データをキーバリュー形式に整形する
3.7.1 多数のプロセスから1つのファイルにレコードを書き込む
3.7.2 制御構文が動作するプロセスについて
4.1.1 RDBで言うところのテーブルを作る
4.1.2 テキスト以外のデータの置き方を決める
4.1.3 データに対するテストを書く
4.2.1 マスタとトランザクションを結合する
4.2.2 集計する
4.3.1 レコードを手動/半自動で追加する
4.3.2 レコードを自動で追加する(排他処理を行う)
4.3.3 レコードを変更する
4.4.1 住所録を印刷用にフォーマットする
4.4.2 バーコード/QRコードを印刷する
4.5.1 ダミーデータを作る
4.5.2 別のデータの持ち方を検討する
5.1.1 CPUの周波数や個数などを調査する
5.1.2 DRAMの量と読み書きの速度を調査する
5.1.3 HDDの容量と読み込み速度,その他の情報を調査する
5.2.1 sortを使いこなす
5.2.2 パイプで並列計算する
5.2.3 バックグラウンド処理で並列化する
5.2.4 xargsで並列化する
5.3.1 GNU grepに仕事をさせる
5.3.2 ページキャッシュを有効利用する
5.3.3 並列処理時のページキャッシュの効果
5.3.4 圧縮してキャッシュにのせて処理する(場合によっては有効)
5.3.5 ファイルを分割しておく
6.1.1 バイナリを閲覧する
6.1.2 バイナリを編集する
6.2.1 画像のデータ形式/サイズ/向きを変える
6.2.2 アニメーションGIFを作る
6.2.3 画像をテキストにして正規化する
6.2.4 画像の一部分を切り出す
6.2.5 ネガを作る
6.2.6 画像を合成する
6.2.7 画像の情報を調査する
6.2.8 SVG画像を作る
6.3.1 CSVをパースして読み込む
6.3.2 CSVをパースしないで読み込む
6.3.3 固定長のデータをスペース区切り(SSV)にする
6.3.4 PDFファイルを端末で読む
6.4.1 Excelファイルからデータを抽出する
6.4.2 Word,PowerPointのデータを抽出する
6.4.3 Excel,Word,PowerPointファイルの中を検索する
6.4.4 少しずつ違うWordファイルを大量生成する
7.1.1 Web APIを使う
7.1.2 Webサイトを丸ごとダウンロードする
7.2.2 マークアップの重複がないかを確認する
7.2.3 リンク切れを見つける
7.3.1 ポートを操作する
7.3.2 鍵認証でsshを使う
7.3.3 ログインせずにリモートのコンピュータを操作する
7.3.4 リモートの計算リソースを利用する
7.3.5 sshを使わないでデータをやりとりする
7.4.1 電子メールの原本を読む
7.4.2 ファイル名から受信処理時間を抽出する
7.4.3 添付ファイルを抽出する
7.5.1 IPv6のIPアドレスを処理する
7.5.2 IPv4のIPアドレスをソートする
8.1.1 端末を電卓代わりにする
8.1.2 文章の中から数字を抽出して計算する
8.1.3 「桁落ち」「丸め誤差」を気にしながら計算する
8.1.4 n進数とm進数を変換する
8.2.1 各月の最終日を求める
8.2.2 2つの日付の差を計算する
8.2.3 その年の第何週かを求める
8.2.4 n営業日後の日付を求める
8.2.5 西暦/和暦を変換する
8.3.1 一様乱数を作る
8.3.2 ガウス分布に従う乱数を作る
8.3.3 数値積分を行う
8.3.4 数列を作る
8.4.1 データのばらつきを評価する
8.4.2 最小二乗法でデータに直線を当てはめる
8.4.3 相関係数を求める
8.4.4 グラフを描く
A.1 Upstart
A.2 Ubuntuの設定メモ
A.2.1 日本語パッケージをインストールする
A.2.2 wkhtmltopdfをインストールする
A.3 cgroupsの設定
A.4 いたずら
A.4.1 見かけよりも大きなファイルを作る(疑似デバイスを使う)
A.4.2 他人の端末に字を送り込む(デバイスファイルを使う)
A.4.3 どうでもよいファイルをダウンロードさせる(拡張子について)
A.4.4 きわどい名前のファイルやディレクトリを作る(ミスでできたファイルの二次被害防止)
A.4.5 ハト語に変換する(シグナル処理)