【bash】awkを使ってログや出力結果を弄ろう

※アフィリエイト広告を利用しています
※アフィリエイト広告を利用しています

20年くらい前はawk使うと重くなるからなるべく使わないようにしてたのですが、最近はサーバの性能いいからさほど気にしなくて良くなったな〜。
ファイルや出力結果を行単位で解析、変換するのに便利です。
ガッツリやったらそれだけで1冊の本になるそうなので、よく使ってるのだけ紹介します。

数値変換 ($x+0)

$x+0 は文字列として認識される可能性があるフィールドを数値に変換してくれます。
よく使ってるのは df の結果から使用率がx%以上のファイルシステムを取り出すとかに使ってます。

  • $5+0 によって、第5フィールドが数値として扱われます。
  • 数値といて扱われた第5フィールドがしきい値(80%)より大きい「/work」が出力されます。

フィールド操作

フィールドの指定

$xを指定して、必要なフィールドだけ出力します。
$0は行全体となり、末尾のフィールドは$NFを指定し、決まったフィールドは$x($1,$2,$3 …)と数字で指定します。
複数指定する場合は「,」で区切ります。また、フィールドは順番を前後させても良いし、複数指定もできます。

  • 数値変換と同様に80%以上のものを取得しますが、出力結果をマウントポイント(末尾のフィールド:$NF)と使用率(第5フィールド:$5)の順で出力します。

フィールド間の文字列指定

フィールド間はスペースで区切られますが、別の文字列を指定することもできます。
この場合は区切り文字「,」は不要です。

  • 数値変換と同様に80%以上のものを取得し、出力結果をマウントポイントと使用率を「 : 」で区切って出力します。

フィールドセパレータ(区切り文字)の指定

デフォルトの区切り文字(セパレータ)は空白文字となります。
・スペース
・タブ
・連続したスペース
このセパレータはFオプションかFS変数を指定することで変更できます。

Fオプションで指定

CSVファイルは「,(カンマ)」で区切られていることが多いので、これを例にします。

以下の例では「 -F “,” 」 でセパレータを変更して、第2フィールドと第3フィールドを「”:”」で区切って出力します。

FS変数で指定

awkスクリプトのBEGINブロックでFSを指定します。
Fオプションと同様の動きですが、参考です。

OFS変数で出力のセパレータ指定

FSと同様に、awkスクリプトのBEGINブロックでOFSを指定します。
デフォルトはスペースとなるものを別の文字列に変更できます。

BEGINとENDブロック

上で少し使ってますが、BEGINENDで処理の前後に特定の処理を実行できます。

コメント

タイトルとURLをコピーしました