sed + awk をすこしさわった

dotinstall で sedawk の講座が出たから*1せっかくなのでやってみた。思えば grep | sed しか知らないくらいだし、awk なにそれこわいという状態だし。
sed入門 (全10回) - プログラミングならドットインストール
AWK入門 (全13回) - プログラミングならドットインストール

sed(gsed)

GNU sed を使うため、Mac の場合は gnu-sed をインストールする必要がある。

引数

  • f file
  • e exec
    • これは省略可能
  • i repalce
  • n
    • あんまりわかってないけど sed -n 'p' file みたいに p するときに他のを出力しない的な

パターンスペース

アドレスに対してコマンドを実行する。記号はだいたい vi 準拠っぽい感じ

# not
3!d
# それぞれ指定
1d;4d
# 範囲
1,3d
# 末尾
$d
# 正規表現っぽいけどちょっと正規表現じゃない操作
/hoge$/d
  • p = 表示
  • a = apppend
  • i = insert
  • y = copy

まあ vi 準拠なので馴染みやすい

正規表現

s/hoge/moge/gi みたいに正規表現が使える。

  • Regexp でとったら & で参照
  • (match) (match) で \1 \2 で参照

ホールドスペース

パターンスペースの裏でよしなにする。正直難しかったし使わなさそうでだるかった。

  • パターンスペースのバックグランドで動作する
  • hでhold
  • gでget
  • x で excahge(交換)

まあ

正規表現でしかつかわないかとおもったら d,p,a,i と vi like にできるおどろき。まあでもホールドスペースはつらい。ただ sed -i.bak でバックアップはいいね。

awk(gawk)

これも Mac だと gnu-awk をいれる必要がある。

引数と実行

  • f file
  • コマンドラインでは '{}' で実行(""はだめ)。文字列リテラルは "hoge" で文字列連結は space で

概要

行指向スクリプト。レコードに対してフィールドを操作する。行志向スクリプト, Cっぽいらしい。

特殊引数

  • $0,1,2で参照 $0 は全体
  • NR は行番号
  • NF はフィールドの数

文法

大きく分けて処理としては3つになる

  • BEGIN {...}
  • something(条件など) {...}
  • something(条件など) {...}
  • something(条件など) {...}
  • END {...}

BEGIN でよしなに初期設定とかできる。デリミタ(FS(Field Separator))とか、RS でフィールドの区切りとかなんとか。
あと比較演算子と論理演算子とかもある。 (pattern) || (pattern) {command} 比較演算子には正規表現もある(~)。if 的条件もある NR < 5 とか。

関数

文字列、数値、システムコール、配列、辞書とかそれっぽいものがひととおりある。

  • printf あるよ、printf("name:%10s %-5d", $1, $3)
  • 変数と代入演算子もあるよ, 文字列は space で連結だよ
  • 組み込み関数いろいろあるから使えるよ。
    • number は int, log, sin, cos, sqrtとか
    • Stirng は sbustring, length, index, match, splitとか
    • システムコールとかある, timeとか
    • bit演算とか
    • if, for(for in), while ある
    • 配列は 1 から
    • 辞書もあるよ
    • function name(arg){} で定義できるよ

まあ

シェルスクリプトだるいですね。そりゃシェルスクリプトだるくて Perl つくったのうれしいね。がんばってパースするのやだ。でも zsh とかで使えるかも、しれない。たぶんつらぽよくてきっとやらない。

*1:ちょうどこの記事をかいたとき