Linuxのコマンド「awk」についてです!
文字列を、特定の区切り文字で、分割して、特定の文字列を出力できるコマンドです!
シェルスクリプトで、「ある文字列だけ欲しい!」みたいなことが起きたりすると、力強い味方となります!
1番簡素なawk
1番簡素な書き方はこんな感じ。
awk '{print $1}'
コレをやると、与えられた値について
- スペースで文字列を区切る(指定もできる)
- 最初に出てきた項目を返す
ということをします。
例えば
$ echo abc def ghi | awk '{print $1}'
のようにすると
abc
が出力されます。
「どう出力するか?」を指定する
「'{print ~}'」の部分で、「どう出力するか?」を指定します。
分割したうち、特定の出力
例えば「$1」や「$2」のように指定すると、「1つ目の文字列」、「2つ目の文字列」と指定することができます。
$ echo abc def ghi | awk '{print $1}' abc $ echo abc def ghi | awk '{print $2}' def
コレを並べれば複数出力することもできます。
$ echo abc def ghi | awk '{print $1$2}' abcdef
出力したい文字列を作って出力
「$n」で分割した特定の文字列を出力ができましたね。
ここから更に「自分の出力したい文字列」を絡めて、好きな文字列を作って出力してみましょう。
例えば「data-xxx」という文字列を作りたい場合は、このようにします。
$ echo abc def ghi | awk '{print "data-"$2}' data-def
ダブルクォートで囲い、「"xxx"」のようにすると、出力する文字列として扱ってくれます。
スペースを入れたい場合も同様です。 このように「" "」を設定します。
$ echo abc def ghi | awk '{print $3" "$2}' ghi def
この「出力したいスペース」を、ダブルクォートなしで指定してしまうと
$ echo abc def ghi | awk '{print $1 $2}' abcdef
のように、スペースが無視された出力となってしまうので、気をつけましょう。
分割文字を指定する
ここまで「スペースで分割されるよ!」という説明をしてきました。
が、コレは自分で指定することができます。
そのためには「-F」オプションを使用します。
例1: カンマで区切る
例えば「,(カンマ)」で区切りたい場合
awk -F'[,]' '{print $1}'
のように記述します。 実際に使った場合、このように出力されます。
$ echo abc,def,ghi | awk -F'[,]' '{print $1}' abc
例2: カンマとスペースで区切る
区切りたい文字の指定は、1つだけではありません。
例えばこのように記述することで、「,(カンマ)」と「スペース」の2つを区切り文字として認識してくれます。
awk -F'[, ]' '{print $1}'
実際に使った場合、このように出力されます。
$ echo abc,def ghi | awk -F'[, ]' '{print $1"---"$2"---"$3}' abc---def---ghi
使用例: ファイル一覧(ls)から情報を取得する
それでは軽く実践的なところです。
例えば、このように項番付きファイルで構成されたファイル群があったとします。
$ ls -l total 0 -rw-rw-rw- 1 user user 5 May 31 08:44 a0001 -rw-rw-rw- 1 user user 0 May 31 11:30 a0002 -rw-rw-rw- 1 user user 6 May 31 11:31 a0003
このうち「1番項番の大きいファイル」の、ファイル名が欲しいとしましょう。
$ ls -l | tail -1 -rw-rw-rw- 1 user user 6 May 31 11:31 a0003
これで「1番項番の大きいファイル」だけ出力されましたね。
更にここからawkを使って、ファイル名だけを取得します。
$ ls -l | tail -1 | awk '{print $9}' a0003
無事、表示されましたね!
あとがき
Linuxのawkコマンドを使って、文字列を分割・抽出する方法についてでした!
シェルスクリプトで特定のファイル名を抽出したくて知ったのですが、awkコマンド相当便利です。
ファイルコピーを取り扱うようなシェルスクリプトを組むときに、かなり猛威を発揮してくれます。
フォーマットや出力文字列の指定が、微妙に覚えづらいですが、是非活用してみてください!