Software Design plusシリーズ11問、半年以内に習得 シェル・ワンライナー160本ノック

[表紙]1日1問、半年以内に習得 シェル・ワンライナー160本ノック

紙版発売
電子版発売

B5変形判/488ページ

定価3,520円(本体3,200円+税10%)

ISBN 978-4-297-12267-6

電子版

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

シェルのワンライナー(その場かぎりの1行プログラム)は,LinuxやMacのコマンドラインインターフェースを立ち上げたら,すぐにプログラムを書いて即実行できます。ちょっとした作業を手っ取り早く片付けるのに向いています。大量のデータ処理,繰り返し処理ほどその効果は絶大です。本書は,そんなシェル・ワンライナーを身につけるためのトレーニング本です。大量の問題を繰り返し解くことで,実務でワンライナーを活用できるようになることを目指します。 第1部でシェルによるデータ加工の定石を学び,第2部でとっさの閃きと柔軟な発想力を養い,第3部で実務にありそうな問題に取り組むことで応用力を鍛えます。実務でワンライナーを役立てるには,OS(Linux),シェル,スクリプト言語,正規表現,文字コード,画像データ,日付や時間データ,通信プロトコルなどの幅広い知識が必要となります。本書では,まず[練習問題]でそのような事前知識を解説し理解を含め,[問題]で力試しを行うという構成になっています。

こんな方におすすめ

  • シェル・ワンライナー(シェル芸)を習得したい人
  • Linux、Unixを使いこなしたい人
  • システム管理者、サーバ・ネットワーク管理者、インフラエンジニア
  • 大学や企業・研究機関の研究者

本書のサンプル

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

サンプル画像4

サンプル画像5

目次

第1部 シェルとコマンドに親しむ
第1章 Linux環境

  • 1.1 環境を準備する
  • 1.2 端末,シェル,コマンド,ファイルの関係を理解する
    • 練習1.2.a 端末を使う
    • 練習1.2.b コマンドの止め方
    • 練習1.2.c 1+1の計算
    • 練習1.2.d ファイルへの保存
    • 練習1.2.e ファイルとディレクトリの操作
    • 練習1.2.f ファイルのパーミッション
    • 練習1.2.g コマンドの調査
  • 1.3 頻出コマンドを覚える
    • 練習1.3.a sedによる置換の練習
    • 練習1.3.b grepによる検索の練習
    • 練習1.3.c grepによる検索&切り出しの練習
    • 練習1.3.d awkによる検索と計算の練習
    • 練習1.3.e sortとuniqによる集計
    • 練習1.3.f xargsによる一括処理
    • 練習1.3.g bashによるメタプログラミング
  • 1.4 ファイルを操作する
    • 練習1.4.a GitHubからリポジトリをクローン
    • 問題1 ファイル名の検索
    • 問題2 画像ファイルの一括変換
    • 問題3 ファイル名の一括変更
    • 問題4 特定のファイルの削除
  • 1.5 もっとawkとsedに慣れる
    • 問題5 設定ファイルからの情報抽出
    • 問題6 端末に模様を描く
    • 問題7 消費税
    • 問題8 ログの集計
    • 問題9 ログの抽出
    • 問題10 見出しの記法の変換
    • 問題11 議事録の整理

第2章 シェルの基本

  • 2.1 変数と制御構文,コマンドの入出力操作を把握する
    • 練習2.1.a 標準入出力・標準エラー出力
    • 練習2.1.b シェルと変数
    • 練習2.1.c 文字列の連結と置換
    • 練習2.1.d 変数を使った計算
    • 練習2.1.e クォートと変数
    • 練習2.1.f Bashの配列と連想配列
    • 練習2.1.g 繰り返しと終了ステータス
    • 練習2.1.h 条件分岐
    • 問題12 変数の読み込み
    • 問題13 存在しないファイルの初期化
    • 問題14 さまざまなループ
    • 問題15 文字種の変換
  • 2.2 プロセスを意識してシェルを操作する
    • 練習2.2.a プロセスを知る
    • 練習2.2.b プロセスの親子関係を知る
    • 練習2.2.c ビルトインコマンドと外部コマンドを意識する
    • 練習2.2.d サブシェルを使う
    • 練習2.2.e コマンド置換とプロセス置換を使う
    • 問題16 変数のローカル化
    • 問題17 コマンドが使えないときのコピー
    • 問題18 シェルのビルトインだけでの集計
    • 問題19 シェルの機能を利用したファイルの上書き
  • 2.3 ブレース展開とファイルグロブを使いこなす
    • 練習2.3.a ブレース展開
    • 練習2.3.b ワイルドカードとファイルグロブ
    • 問題20 lsの出力をシェルの機能で
    • 問題21 条件がややこしいファイルの一覧の作成
    • 問題22 ダミーのFQDNの生成
  • 2.4 シグナルを理解してあやつる
    • 練習2.4.a シグナルの操作
    • 練習2.4.b シグナルの種類
    • 問題23 別のシェルにシグナルを飛ばす
    • 問題24 exit時にファイルを消す
    • 問題25 pipefail時の困りごと
    • 問題26 18時を過ぎたら帰りましょう
  • 2.5 シェルやコマンドを扱う際の微妙な挙動や機能に触れる
    • 問題27 引数を変えてコマンドを再実行
    • 問題28 変な名前のディレクトリの扱い
    • 問題29 シェルスクリプトのエラーチェック
    • 問題30 前方一致する変数名

第2部 発想力を鍛える
第3章 文章と文字の扱い

  • 3.1 テキストの扱いを遊んで理解する
    • 練習3.1.a Perl,Rubyワンライナー
    • 練習3.1.b Pythonワンライナー
    • 練習3.1.c 正規表現の種類
    • 練習3.1.d Perlを使った置換
    • 問題31 大文字への変換
    • 問題32 回文の検出
    • 問題33 回文かどうかの判定
    • 問題34 漢字の後ろにふりがなを入れる
    • 問題35 5文字以上のカタカナ言葉を使ったらアウト
    • 問題36 括弧の対をチェック
  • 3.2 文章を調査・加工する
    • 練習3.2.a 行またぎの検索と置換
    • 練習3.2.b ひらがなとカタカナの変換
    • 練習3.2.c 漢字と読みの変換と日本語と英語の翻訳
    • 練習3.2.d フォーマットの変換
    • 問題37 コピペミスの検出
    • 問題38 込み入った文字実体参照の解決
    • 問題39 文章の折り返し
    • 問題40 雑多な変換
    • 問題41 注釈のチェック
    • 問題42 順序付きリストの整形
    • 問題43 文献リストのソート
    • 問題44 行またぎの検索
    • 問題45 複数行にわたる重複の検索
    • 問題46 ルビを付ける

第4章 データの管理,集計,変換

  • 4.1 表形式のデータを扱う
    • 練習4.1.a 表計算
    • 練習4.1.b データの連結
    • 問題47 前月比データの付加
    • 問題48 CPU負荷の調査1
    • 問題49 CPU負荷の調査2
    • 問題50 売り上げの集計
    • 問題51 テストの得点一覧の出力
    • 問題52 集計形式の変換
    • 問題53 欠損値の補完
  • 4.2 ややこしいフォーマットのデータを扱う
    • 練習4.2.a JSONとjq
    • 練習4.2.b エスケープの入ったCSVの扱い
    • 問題54 JSONファイルからの抽出
    • 問題55 JSONログの比較
    • 問題56 非正規データ同士の結合
    • 問題57 テーブルのレイアウトの整形
    • 問題58 CSVファイルの数字の集計
    • 問題59 CSVの列数の調査
  • 4.3 日付や時間を扱う
    • 練習4.3.a 日付や時刻の計算をする
    • 問題60 プレミアムフライデー
    • 問題61 先週のファイル
    • 問題62 休日の突き合わせ
    • 問題63 第5週が存在する月の調査
    • 問題64 第三火曜日の列挙
    • 問題65 各月の休日数
    • 問題66 リスケジュール
    • 問題67 曜日別に分割
    • 問題68 Unix時刻の限界
    • 問題69 うるう秒

第5章 文字コードとバイナリ

  • 5.1 文字コードに親しむ
    • 練習5.1.a n進数
    • 練習5.1.b ASCIIコード
    • 練習5.1.c UnicodeとUTF-8
    • 練習5.1.d 文字コードと改行記号の変換
    • 問題70 Excel方眼紙
    • 問題71 文字のバイト数の調査
    • 問題72 絵文字
    • 問題73 展開後文字化けしたファイル名の修正
    • 問題74 未確定の元号
    • 問題75 絵文字を除去したい
    • 問題76 少し前のMacでできたファイルのリスト
    • 問題77 異なる文字コードのファイルの一括検索
    • 問題78 常用漢字でない漢字の検出
    • 問題79 文字コードの特定
  • 5.2 バイナリをあやつる
    • 練習5.2.a 文字列のバイナリ解析とバイトオーダ
    • 練習5.2.b バイナリファイル調査用のコマンド
    • 問題80 2進数から文字列を復元
    • 問題81 BOMの識別
    • 問題82 画像の分割
    • 問題83 Shift_JISをそのままechoするシェルスクリプト
    • 問題84 改行コードの識別と集計
    • 問題85 文字のバイナリの平均をとる
    • 問題86 分数の計算
    • 問題87 odの出力の復元
    • 問題88 電子透かしの解読
    • 問題89 CTF

第6章 パズル

  • 6.1 数学で遊ぶ
    • 練習6.1.a 正確な計算
    • 練習6.1.b 素数
    • 練習6.1.c 組み合わせの生成
    • 問題90 n進数の計算
    • 問題91 組み合わせの抽出
    • 問題92 指数の計算
    • 問題93 最初に素数になる年月日時分秒
    • 問題94 ラグランジュの四平方定理の部分的な検証
    • 問題95 交番二進符号
  • 6.2 雑多な問題を片付ける
    • 問題96 日程調整
    • 問題97 縦読みの文字列の検出
    • 問題98 レコードの振り分け
    • 問題99 ポーカーの役
    • 問題100 しりとり順に並べる
    • 問題101 連続するアルファベットの検出と略記
    • 問題102 クワイン

第3部 応用する
第7章 Linux環境の調査,設定と活用

  • 7.1 ファイル,ディレクトリを調査・操作する
    • 練習7.1.a 各種ファイルの置き場所
    • 練習7.1.b ファイルシステム
    • 練習7.1.c iノード
    • 問題103 ls -lの出力の2列目
    • 問題104 ファイル名の長さの限界は?
    • 問題105 ディスク使用量の集計
    • 問題106 特殊なパーミッション
    • 問題107 何回rootになった?
    • 問題108 トラブルを起こしたプロセスの解析
    • 問題109 中身が同じファイルの検索
    • 問題110 複数のディレクトリ内のファイル数をカウント
  • 7.2 疑似ファイルシステムを利用する
    • 練習7.2.a 疑似ファイルシステム
    • 練習7.2.b プロセス置換とファイル
    • 問題111 ロードアベレージの調査
    • 問題112 日付の取得
    • 問題113 カレントディレクトリの調査
    • 問題114 共有ライブラリの検索
    • 問題115 USBメモリのアンマウント
    • 問題116 デバイスの番号調査
    • 問題117 USBの抜き差しの監視
    • 問題118 プロセスが開いているファイルの調査
    • 問題119 メモリマップの表示
    • 問題120 謎のデータの調査
  • 7.3 システムコールを追いかける
    • 練習7.3.a straceを使う
    • 問題121 ファイルパスの抽出
    • 問題122 使ったプロセス数のカウント
    • 問題123 計算時間の解析
  • 7.4 雑多な調査と設定を片付ける
    • 問題124 ネットワークデバイス一覧
    • 問題125 IPアドレスの追加
    • 問題126 Bashのバージョンと変数
    • 問題127 端末エミュレータのウィンドウサイズ
    • 問題128 grepの挙動の違いの正体を突き止めろ
    • 問題129 実行ファイルから文字列を抜き取る
  • 7.5 ワンライナーでサービスをしかける
    • 問題130 即席のWebサーバ
    • 問題131 メールの通知を投げる
    • 問題132 ログの監視&アラート
    • 問題133 システムを自動でシャットダウンする

第8章 ソフトウェア開発中に繰り出すワンライナー

  • 8.1 ソースコードやスクリプトを調査・整形する
    • 問題134 Pythonのインデントの確認
    • 問題135 Lispの括弧の整合性の確認
    • 問題136 関数の位置の入れ替え
    • 問題137 コードの整形
  • 8.2 データを生成する
    • 練習8.2.a ダミーデータの生成
    • 問題138 テストケースの作成
    • 問題139 URLの列挙
    • 問題140 Webサイトの構造からアクセスログを生成
    • 問題141 テーブル情報からのダミーデータ生成
    • 問題142 ビットスクワッティング
  • 8.3 Gitのリポジトリを調査・操作する
    • 練習8.3.a リポジトリの用意
    • 練習8.3.b 変更されたファイルの確認
    • 練習8.3.c コミット済みの情報を利用する
    • 練習8.3.d ブランチとマージ
    • 問題143 条件にあうファイルだけをコミット
    • 問題144 条件にあうファイルだけをもとに戻す
    • 問題145 コミットの頻度を調べる
    • 問題146 ずっとマージされていないブランチを調べる

第9章 インターネットと通信

  • 9.1 インターネットから情報を取得する
    • 練習9.1.a HTML文章の処理
    • 問題147 単語の出現頻度
    • 問題148 駅名のリストの作成
    • 問題149 天気情報の取得
    • 問題150 複数ページのスクレイピング
    • 問題151 複数サイトの情報の連携
  • 9.2 通信関係の調査や操作を行う
    • 練習9.2.a 名前解決
    • 練習9.2.b HTTPステータスコード
    • 問題152 ネットワーク監視
    • 問題153 telnetコマンドでHTTP通信
    • 問題154 /etc/hostsの使用調査
    • 問題155 不正なContent-Length
    • 問題156 複数IPのアドレスが登録されているドメイン
    • 問題157 pingのパケット解析
    • 問題158 パケットを使ったOSの推定
    • 問題159 複数のドメインのチェック
    • 問題160 SSL証明書の調査

著者プロフィール

上田隆一(うえだりゅういち)

Twitter:@ryuichiueda
「シェル芸」という言葉を作った人。本業はプログラミングの得意(自称)なロボット工学の研究者。ロボットサッカーの競技者で某国立大の教員だったが,現場経験がないとプログラミングは語れないと思って(あと,大学がいろいろ面倒くさいと思って)研究を中断し,4年半,ロボットとは無関係の企業システムを手がける企業に勤務。現在は千葉工業大学の教員。企業時代から執筆活動を始めてシェル芸と本業両方で著書多数。GitHub(https://github.com/ryuichiueda)では自作のシェルやBash製のCMS,ワンライナー用のPythonラッパーであるopy,その他ロボット用のプログラムを公開している。


山田泰宏(やまだやすひろ)

Twitter:@grethlen
シェル芸のコミュニティでは「ぐれさん」の愛称で呼ばれているIT技術者。海外から本書の執筆に参加。GitHub(https://github.com/greymd)ではojichatの作者として知られるほか,tmuxのペイン分割を楽にするtmux-xpanes,本書でも利用されているteipやCureutilsなど有用なCLIツールをメンテナンスしている。


田代勝也(たしろかつや)

Twitter:@papiron
プログラミング挫折経験ありの福岡在住IT系エンジニア。プログラミングの練習は,RubyのpryなどREPL環境で対話的に試行錯誤するのが好き。システムのさまざまな調査やデータ処理など,シェル芸を武器に日々格闘しつつもKOされる事多し?


中村壮一(なかむらそういち)

Twitter:@kunst1080
シェル芸勉強会の大阪サテライトの発起人。Web系エンジニアのような何か。最近はVR空間内でビジュアルプログラミングをするのにハマりつつある。


今泉光之(いまいずみみつゆき)

Twitter:@bsdhack
古き良きUnixライフが好きなおじさん(本人談)。


上杉尚史(うえすぎなおふみ)

Twitter:@blacknon
都内のセキュリティ企業に勤務している人。ターミナルのプロンプトが独特。昔は家にサーバラック(24U)がいた。たまにブログ(https://orebibou.com)も書いている。GitHub(https://github.com/blacknon)ではTUIのGo言語製sshクライアントなど,仕事で使えそうなツールを公開している。