Open7

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

ikawahaikawaha

Day 1

  • 練習1.2.a 端末を使う
  • 練習1.2.b コマンドの止め方
  • 練習1.2.c 1+1の計算
  • 練習1.2.d ファイルへの保存
  • 練習1.2.e ファイルとディレクトリの操作
  • 練習1.2.d ファイルのパーミッション
  • 練習1.2.g コマンドの調査
ikawahaikawaha

Day 2

  • 練習1.3.a sedによる置換の練習
    • && を利用するとマッチの再利用が可能
    • -E を利用すると拡張正規表現が利用可能 (カッコをエスケープしなくて良い)
  • 練習1.3.b grepに夜検索の練習
    • xargs で出力を横に並べ直せる
  • 練習1.3.c grepによる検索&切り出しの練習
  • 練習1.3.d awkによる検索と計算の練習
    • GNU Awk を利用
    • ルール=パターン+アクション
    • BEGIN と END もパターン
    • printf 便利
  • 練習1.3.e sortとuniqによる集計
    • 三項演算子使える
    • uniq -c でカウント可能
    • sort -k field1[,field2]
    • sort -n
    • awk の連想配列 a["偶数"]
  • 練習1.3.f xargsによる一括処理
    • xargs -n number で一度に受け付ける行を指定できる
    • コマンドを指定しなかったときは echo が実行されるので横に並ぶ
      • 注意点:echo に渡されるだけなので、echo のオプションとして解釈される文字があるとそれは echo に喰われる
  • 練習1.3.g bashによるメタプログラミング
ikawahaikawaha

Day 3

  • 問題1 GitHubからリポジトリをクローン
  • 問題2 画像ファイルの一括変換
    • file コマンドでファイル種別が分かる
    • xargs-P は parallel の P。-P$(nproc) とすると nproc で取れる最大の CPU 数が設定できる
  • 問題3 ファイル名の一括変更
  • 問題4 特定ファイルの削除
    • 解答の $ grep -l '^10$' -R$ grep -l '^10$' -R . の誤植ではないかな。grep の種類によるのかな?
ikawahaikawaha

Day 4

  • 問題5 設定ファイルからの情報抽出
    • mac の ntp.conf は出題の形式ではない・・・。shelgei160/qdata/5/ntp.conf を利用する
  • 問題6 端末に模様を描く
    • awk の print は改行する。改行したくなければ printf をつかう
    • taccat の reverse
    • echo でメタ文字を認識させる echo -e "abc\ndef"
  • 問題7 消費税
    • 三項演算子を使うことでうまく else を表現するのが短く書くコツかも
  • 問題8 ログの集計
    • awk の NF は列数を示してくれる(Number of Fields)
    • date コマンドを使う別解は mac の date は使えない。gdate を使う
  • 問題9 ログの抽出
    • sed -n '/re1/,/re2/p' 正規表現 re1 から re2 までのマッチする行を取れる。awk でも同様に出来る(awk は正規表現並べるだけ。こっちのが簡単)
  • 問題10 見出しの記法の変換
    • awk でやるときに空白行をマッチさせる条件を忘れないようにしないといけない
  • 問題11 議事録の整理
    • なんでも awk でやろうとするのは間違いかも知れない(マッチしないのは消えたりするので)。sed でやる
      • sed の方が簡単だった
ikawahaikawaha

Day 5

  • 練習2.1.a 標準入出力・標準エラー出力
    • brew install gnu-sed して gsed でやる
    • |&2>&1 | の省略だけど、いつも覚えられない
  • 練習2.1.b シェルと変数
  • 練習2.1.c 文字列の連結と置換
    • a=ねこはいます のとき ${a:3:2} は "いま"。${変数名:開始位置:長さ}
  • 練習2.1.d 変数を使った計算
    • a=2; b=6; echo $((a+b)) のとき 8
  • 練習2.1.e
    • シェルスクリプトを書くときは、空文字対策として、変数はなるべくダブルクォートで囲っておくことをお勧めします

  • 練習2.1.f Bashの配列と連想配列
    • ややこしい
ikawahaikawaha

Day 6

  • 練習2.1.g 繰り返しと終了ステータス
    • printf コマンド
    • echo ${PIPESTATUS[@]} で各パイプの結果が分かる
    • "$*""$@" の違い
ikawahaikawaha

Day 7

  • 練習2.1h 条件分岐
  • 問題12 変数の読み込み
    • ${1:-$(cat)} $1 が空なら、cat コマンドに渡ってくる入力が $1 にセットされる。コマンドは何でもよさそう・・・
  • [ -e unfile ] || touch unfilecat <> unfile と書ける。<> は読み書きでファイルをオープンの意。
  • 問題13 存在しないファイルの初期化
  • 問題14 さまざまなループ