awk 'BEGIN{前処理(初期化や区切り文字指定等)} (パターン) {アクション(通常処理等)} END{後処理(出力処理等)}'
| BEGIN{} | 前処理部分。省略可能 |
| (パターン) | 条件絞込部分(grepに近い)。省略可能 |
| 正規表現記述や$1=="test"等の評価式を入れる。 | |
| 正規表現は通常$0に対して行われるが、$1 ~ /正規表現/とすると、$1や$2に限定することもできる。(正規表現の否定は!~) | |
| パターンの条件は&&や||で複合的にすることができる。 | |
| パターンは()で囲わなくてもパターンとして認識する。 | |
| {アクション} | レコード数(≒行数)分繰り返し処理を行う部分。省略すると{print $0}になる模様。 |
| END{} | 後処理部分。省略可能 |
| v | vオプションの後に「変数名=値」とすることで、後続処理に変数値を与えることもできる。 |
| f | fオプションの後にawkスクリプトを指定ことで、処理記述を外部スクリプトに任せることも可能。 |
| F | 区切り文字を指定。区切り文字が複数ある場合は[]で囲う。空白複数個等の場合は[ ]+で表現可能。 |
| $0 | レコード |
| $1,$2… | レコードのX番目のフィールド。使用例(フィールドの1番目と2晩目の合計を表示):cat test.txt | awk '{print $1+$2} |
| NR | 現在のレコード数。行番号。 ■例:3行目だけを抽出したい場合: head -n 3 | tail -n 1と書く所を、awk 'NR==3'のように表現可能。 ■例:1行目〜3行目を抽出したい場合: awk '(NR==1,NR==3){処理内容等}'のように記載できる |
| NF | 現在のフィールド数。1行の内、何個のフィールド(単語的な意味合い)があるか。 |
| RS | 入力レコードの区切り文字 |
| FS | 入力フィールドの区切り文字。Fオプション(BEGIN{FS="区切り文字"}とほぼ同意)でも可。 |
| ORS | 出力レコードの区切り文字 |
| OFS | 出力フィールドの区切り文字 |
| getline | ファイルやパイプから1行読み込む。getline 変数名とすることで読み込んだ「次の行」を変数名に入れることができる。※awk '{getline 変数名;}'とした場合、2行目が入る点に注意。 |
| match | 正規表現が最初に出る位置。match(文字列,正規表現)。RSTARTに正規表現が合致した開始位置、RLENGTHにそこからの長さを格納する |
| split | 文字列を配列に分解。split(分解する文字列,分解後の格納配列,分解するための区切り文字) |
| index | 文字が最初に出る位置。index(文字列,開始文字) |
| sprintf | 書式に従って表示 |
| substr | 部分文字列を返す。substr(文字列,開始番目,長さ) |
例えば、
/*test.txt*/
1行目データ
2行目データ
3行目データ
/*実行コマンドと実行結果*/
cat test.txt | awk 'BEGIN{getline}{print NR}'
2
3
ちなみにそうしたくない場合は、以下のようにすると回避できた。
cat test.txt | awk '{getline 変数名; printf("%s",変数名);}や
cat test.txt | awk '{getline 変数名;}END{print 変数名;}'
awk 'BEGIN { print "*** begin ***"}(/hoge/){ print $1} END { print "*** end ***"}' test.txt
*** begin *** hogehoge hogehoge2 *** end *** ※test.txtの中身が下記の場合 hogehoge hogedesu test sample hogehoge2
/*test.txt*/
xxx:yyy
/*test.txtからyyyを抽出するコマンド*/
例1:cat test.txt | awk '{split($0,arr,":"); print arr[1]}
例2:cat test.txt | awk '{print substr($0,index($0,":")+1)}'
例3:cat test.txt | awk 'match($0,/:(.*)/){print substr($0, RSTART+1, RLENGTH)}'
3-1.ログのunix時間を見やすい時刻に変更する。 https://qiita.com/todaemon/items/1003021309a6bf28d463参照
3-2.logから特定時刻のみを抽出
/*xxx.log*/
YYYY-MM-DD HH:MM:SS.XXX logtext1
YYYY-MM-DD HH:MM:SS.XXX logtext2
/*logファイルから、特定時刻の物のみを抽出するコマンド*/
例1:
cat xxx.log | ¥
awk '($1 ~ /YYYY-MM-DD/ ) {
split($2,array,":");
if(array[1] >=8 && array[1] <= 10){
print $0
}
}'
とすると、YYYY-MM-DDで8時〜10時のログが取れる。