awkの使い方

$NF 最後の文字列

# echo "a1 b1 c1" | awk '{print $NF}'
c1

数値が20000000より大きい

# grep -n consumed *.log | grep Lku | awk '$6 > 20000000{print $1,$2,$6}'
ABCM4110_JOBSTATUS_20120101124731.log:4758: Lku_01,0: 21838780

文字列抜き出し

# A="ABCSO2210 16時23分28秒 平成31年 6月26日(水)"
# echo $A | awk '{print $2}'
16時23分28秒
# echo $A | awk '{print(substr($2,1,2)":"substr($2,4,2)":"substr($2,7,2))}'
16:23:28
# A="21001 17:00:30 24 MAY 2019"
# echo $A | awk '{print(substr($2,1,2)":"substr($2,4,2)":"substr($2,7,2))}'
17:00:30

タイムスタンプ(日本、英語)のフォーマット変換

タイムスタンプを含んだデータの抽出をする場合、フォーマットに日本語(元号)、英語の両方が含まれていると容易にgrepなどで実現できないことがある。
awkで比較的容易に実装できる。
テストデータは以下。
$ cat sample.txt
test1 21時02分39秒 平成30年 6月20日(木)
test2 21時02分39秒 令和元年 6月20日(木)
test3 21時02分39秒 令和12年 6月20日(木)
test4 16:11:01 29 MAY 2019
test5 09:59:24 5 JUN 2016

変換結果は以下。
$ cat sample.txt | awk -f sample1.awk
test1 20180620 21:02:39
test2 20190620 21:02:39
test3 20300620 21:02:39
test4 20190529 16:11:01
test5 20160605 09:59:24

$ cat sample1.awk
{
    if(substr($2,3,1) == "時") {
       time=substr($2,1,2) ":" substr($2,4,2) ":" substr($2,7,2)
       if(substr($3,1,2) == "平成") {
          year=substr($3,3,2) + 1988
       } else if(substr($3,1,4) == "令和元年") {
          year=2019
       } else { # 令和2年以降
          if(substr($3,4,1) == "年") {
             year=substr($3,3,1) + 2018
          } else {
             year=substr($3,3,2) + 2018
          }
       }
       tuki=substr($4,2,1)
       if(tuki == "月") {
          month=substr($4,1,1)
          if(substr($4,4,1) == "日") {
             day=substr($4,3,1)
          } else {
             day=substr($4,3,2)
          }
       } else {
          month=substr($4,1,2)
          if(substr($4,5,1) == "日") {
             day=substr($4,4,1)
          } else {
             day=substr($4,4,2)
          }
       }
    } else {
       time=$2
       day=$3
       year=$5
       if($4 == "JAN") {
          month=1
       } else if($4 == "FEB") {
          month=2
       } else if($4 == "MAR") {
          month=3
       } else if($4 == "APR") {
          month=4
       } else if($4 == "MAY") {
          month=5
       } else if($4 == "JUN") {
          month=6
       } else if($4 == "JUL") {
          month=7
       } else if($4 == "AUG") {
          month=8
       } else if($4 == "SEP") {
          month=9
       } else if($4 == "OCT") {
          month=10
       } else if($4 == "NOV") {
          month=11
       } else {
          month=12
       }
    }
    if(length(month) == 1) {
       month="0" month
    }
    if(length(day) == 1) {
       day="0" day
    }
    print $1 " " year month day " " time
}

AWKで指定日付より後のデータを抽出する

$ REQUIRED_DATE=20190620
$ cat sample.txt | awk -f sample1.awk | awk '$2 >= DATE'{print} DATE=${REQUIRED_DATE}
test2 20190620 21:02:39
test3 20300620 21:02:39

AWKでSUMする

# grep "produced" ABC1100_JOBLOG_20170709193241.log | grep "Trf_02"
Trf_02,0: Output 0 produced 137502 records.
Trf_02,1: Output 0 produced 36238573 records.
Trf_02,2: Output 0 produced 6479675 records.
Trf_02,7: Output 0 produced 109750 records.
Trf_02,3: Output 0 produced 1711917 records.
Trf_02,5: Output 0 produced 367398 records.
Trf_02,4: Output 0 produced 720240 records.
Trf_02,6: Output 0 produced 213023 records.
[root@VI-DWH-DS01 log]# grep "produced" ABC1100_JOBLOG_20170709193241.log | grep "Trf_02" | awk '{sum+=$5}END{print sum}'
45978078

AWKで正規表現

# seq 1000 | awk '/[123][5][1]/{print}'
151
251
351

コメント

人気の投稿