LoginSignup
26
25

More than 5 years have passed since last update.

awk力を0からせめて1に上げる

Last updated at Posted at 2015-02-14

ゴール

熟練のawk職人になりたいわけではないが、ワンライナーで簡単な処理ならかける程度を目指す

awkの基本を学ぶ

ドットインストールでawkの基本を復習
awk基礎学習

ゆるふわな用語説明

用語 説明
NF 組込み変数 Number of Fieldの略.フィールド数
NR 組込み変数 Number of Recordの略? レコードの数.最初のレコードは1
FS 組込み変数 Field Separatorの略? FSとして正規表現による指定も可能
BEGIN ブロック 通常のブロックは行毎に実行されるが、BEGINは最初のみ実行される.初期化に使用
END ブロック 最後に実行される。出力や最終結果の計算等に使用する
正規表現 ブロック 正規表現にマッチする行に対する処理を書きたい時に使用する

ゆるふわな組込み関数説明

関数名 説明
index(in, find) 引数inの文字列からfindで指定した文字が現れる場所を返す(1文字目ば1なことに注意). ない場合は0を返す.
length(string) 文字列の長さを返す
printf(fmt, item1, item2...) Cのprintf的に使える.どこまで同じかは不明.
substr(string, start, [,length]) 指定した範囲の部分文字列を返す
tolower(string) 小文字に変換する
toupper(string) 大文字に変換する

こういう時はどう書くか

セパレータを指定して処理したい

-Fでセパレータを指定

$awk -F ":" '{ print $1 " " $3 }' /etc/passwd

各フィールドをループしたい

$awk '{for (i = 1; i <= NF; i++) print $i;}' data.txt

複数の記号をセパレータとして使用したい

  • 正規表現を使用するとできる
  • 以下はスペースと:と/を区切り文字として使用した場合の例
$ echo "2014/03/08 12:12:12" | \\
  awk -F'[ :/]' '{print $2}'

特定の正規表現のパターンにマッチする行だけ処理する

$awk -F':' '$0 ~ /root/{ print}' /etc/passwd

文字列を数値に変換する

  • 特に何もする必要がない。数値を表した文字列は数値に自動的に変換される。
$echo | awk '{ x="1.01"; x=x+1; print x}'
2.01

部分文字列を作成する

$echo 'abcde' | awk '{print substr($0, 2)}'

特定の制御文字でフィールドを区切る

  • 下の例では^Aの部分が制御文字
  • ^Aの場合はCtrl+v Ctrl+Aでターミナル上から入力できる
$more control_code.txt
a^Ab

$awk -F'^A' '{print $1 ":" $2}' control_code.txt
a:b
  • バイナリの値を以下のように指定する事もできるっぽい
  • 値は参考URLの制御コード表が参考になる
$awk -F'\01' '{print $1 ":" $2}' control_code.txt 
a:b

引用元/参考URL

USP MAGAZINEコラボレーション連載/「シェル芸」に効く AWK処方箋
http://codezine.jp/article/corner/516

共通テーマ: 実例でわかる awk: 第 1 回
http://www.ibm.com/developerworks/jp/linux/library/l-awk1/

制御コード表
http://ash.jp/code/ctrltbl.htm

9.1 Built-in Functions - The GNU Awk User’s Guide
http://www.gnu.org/software/gawk/manual/gawk.html#Functions

26
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25