awkとは、UNIXのフィルタ系コマンドであり、プログラミング言語でもある。
UNIXというOSは、小さく簡単なプログラムを組み合わせて複雑な処理を行うという考え方で実装されている。このような入力を加工して出力するプログラムを特にフィルタと呼び、それを組み合わせる機能の一つをパイプと言う。
行を抽出するコマンドのgrepや、ラインエディタedをストリーミング処理に向きにしたsedより、さらに複雑な処理を行えるようにプログラミング可能としたものがawkである。処理できるのはテキストファイルのみで、バイナリファイルは扱えない。sedとawkのいいとこ取りをしバイナリファイルを扱えるようにして生まれたのがPerlである。
コマンド名は作成者である、エイホ、ワインバーガー、カーニハンの頭文字を取って付けられた。
特徴は、一行の文字列を区切り文字で簡単に分割して扱えること、連想配列が扱えること。文法はC言語に似ている。後にawkを改良したnawk(new awk)が開発され、現在ではgawk(GNU awk)など他の実装もある。
商用UNIX系OSは、素の状態ではCコンパイラがインストールされてないこともあるので、テキストファイルについてはawkでチョイチョイと急場をしのぐことも多々ある。
gawkでは3.1からTCP/IPでの通信もできるようになった。
xgawkという、gawkに以下の機能を追加したGNUとは別のバージョンが開発中である。
など。
{print $1}
以下のように実行すると、passwdファイルにあるログイン名だけを出力する。"-F:"は区切り文字を":"にするオプション。
awk -F: -f hoge.awk /etc/passwd
awk -F: '{print $1 }' /etc/passwd
フィルタとしての処理の前後に特別な処理を記述することができる。変数の初期化や結果の表示に利用できる。
行のカウントをしてみる。
BEGIN{
i = 0
}
{
i ++
}
END{
print i
}
BEGINだけを使って普通のプログラミングっぽく。古いawkでは実行不可。
BEGIN{
i=0
while( i < 10 ) {
print i
i++
}
}
フィルタ系コマンドをパイプでつないでみる。ファイルpiyo中に出現する単語のうち数の多いものを10個表示。英語のように単語が空白で区切られているもののみ。適当だけど。
awk '{for(i=1;i<=NF;i++){print $i}}' piyo | sort | uniq -c | sort -nr | head
掲示板
急上昇ワード改
最終更新:2024/03/28(木) 21:00
最終更新:2024/03/28(木) 21:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。