1. tofu511

    Posted

    tofu511
Changes in title
+[初心者向け]Awkの使い方
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,153 @@
+自分用のまとめです。
+間違いなどあればご指摘いただけると嬉しいです!
+
+## Awkとは?
+>AWK(オーク)は、プログラミング言語の一つ。テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。UNIX 上で開発された。(Wikipediaより)
+
+UnixやLinux環境でファイルを集計したりするときにつかえる便利なプログラミング言語。
+Linuxコマンドっぽく使える。
+
+
+## 実行方法
+```
+# スクリプトをコマンドに含める場合
+awk 'スクリプト' [ 入力ファイルのパス ]
+
+# 外部のスクリプトファイルを読み込む場合
+awk -f スクリプトファイルのパス [ 入力ファイルのパス ]
+
+# catコマンドを用いることもできる
+cat foo.log | awk 'スクリプト'
+
+
+# 例:foo.txtの中身を出力する
+$ awk '{ print $0 }' foo.txt
+foo
+bar
+baz
+foobar
+foobaz
+barbaz
+```
+
+## スクリプト
+`'スクリプト'`の部分には抽出などのルールを記載する。
+`'スクリプト'`の部分は「パターン文」と「アクション文」から成り立つ。
+
+```
+# 書き方
+awk 'パターン { アクション }' [ 入力ファイルのパス ]
+
+
+# 例:foo.txt内で「bar」という文字列を含む行を出力する
+$ awk '/bar/ { print $0 }' foo.txt
+```
+
+## パターン
+パターンは以下の3種類
+1. 正規表現
+2. BEGIN
+3. END
+4. 評価式
+
+### 正規表現
+正規表現はスラッシュの間に入れる。
+
+```
+# 書き方
+awk '/正規表現/ { アクション }'
+
+# 例:foo.txt中から最後がbarで終わるものを出力
+$ cat foo.txt
+foo
+bar
+baz
+foobar
+foobaz
+barbaz
+
+$ awk '/bar$/ { print $0 }' foo.txt
+bar
+foobar
+```
+
+### BEGIN,END
+BEGINは最初の行を読み込む前の処理を、ENDは最後の行を読み込んだ後の処理を書く。
+
+```
+# 書き方
+awk 'BEGIN { 最初の行を読み込む前の処理 } { メイン処理 } END { 最後の行を読み込んだ後の処理 }'
+
+# 例: foo.txtの出力前に==BEGIN==を、出力後に==END==を出力する
+$ awk 'BEGIN { print "==BEGIN==" } { print $0} END { print "==END==" }' foo.txt
+==BEGIN==
+foo
+bar
+baz
+foobar
+foobaz
+barbaz
+==END==
+```
+
+### 評価式
+パターンの部分を評価式にすることも可能
+
+```
+# 書き方
+awk '評価式 { アクション }'
+
+# 例:foo.txtからfooに一致する行を出力する
+$ awk ' $0 == "foo" { print $0 }' foo.txt
+foo
+```
+
+
+## 組み込み変数
+awkにあらかじめ定義されている変数。
+
+|組み込み変数|内容|デフォルト値|
+|:--------|:---------|:---------|
+|$0|レコード||
+|$n|レコードのn番目のフィールド||
+|FILENAME|ファイル名|"-"|
+|RS|レコードの区切り文字|改行(\n)|
+|FS|フィールドの区切り文字|スペース|
+|ORS|出力レコードの区切り文字|改行(\n)|
+|OFS|出力フィールドの区切り文字|スペース|
+|NR|入力中のレコード数|現在の入力ファイル数のレコード数|
+|NF|レコード中のフィールド数|現在の入力レコード中のフィールド数|
+
+```
+# 例:foo.txtの2行目を出力する
+$ awk ' NR == 2 { print $0 }' foo.txt
+bar
+
+# 例:foo.txtの内容をカンマ区切りで出力する
+$ awk ' ORS = ","{ print $0 }' foo.txt
+foo,bar,baz,foobar,foobaz,barbaz,
+
+# 例:foo.txtの内容を行番号込で出力する
+$ awk ' { print NR, $0 }' foo.txt
+1 foo
+2 bar
+3 baz
+4 foobar
+5 foobaz
+6 barbaz
+```
+
+
+## 参考にさせてもらったサイト
+もっと知りたい方は以下のサイトもどうぞ
+
+さくっと知りたい人向け
+http://itref.fc2web.com/unix/awk.html
+http://www.osaka-kyoiku.ac.jp/~kokugo/nonami/awk/awkmini.html
+http://shellscript.sunone.me/awk.html
+
+ガッツリ知りたい方向け
+http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_toc.html
+
+歴史とかも知りたい人向け
+https://ja.wikipedia.org/wiki/AWK