awk使用备忘

awk的主体块

主体部分的语法要求如下:

/pattern/ {awk-commands}

前段时间有个需求:就是获取db2 list directory的结果中与我的需求数据库名称一致的数据库的一些信息:

[db2inst1@bogon tmp]$ db2 list db directory

 System Database Directory

 Number of entries in the directory = 3

Database 1 entry:

 Database alias                       = DBMDB
 Database name                        = DBMDB
 Local database directory             = /home/db2inst1
 Database release level               = 14.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

Database 2 entry:

 Database alias                       = TYDB_161
 Database name                        = TYDB
 Node name                            = NODE_161
 Database release level               = 14.00
 Comment                              =
 Directory entry type                 = Remote
 Catalog database partition number    = -1
 Alternate server hostname            =
 Alternate server port number         =

Database 3 entry:

 Database alias                       = MYDB
 Database name                        = MYDB
 Local database directory             = /home/db2inst1
 Database release level               = 14.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

比方说想获得Database alias= MYDB的其他信息,比如Database name,Local Database directory信息等,当时的处理办法是这样的:

[db2inst1@bogon tmp]$ db2 list db directory| grep 'MYDB' -A 5|grep 'Database name'|awk -F'=' '{print $2}'
 MYDB
[db2inst1@bogon tmp]$ db2 list db directory| grep 'MYDB' -A 5|grep 'Local database directory'|awk -F'=' '{print $2}'
 /home/db2inst1

  grep了两次,还是有点儿繁琐的哈,后面看到了“别人家的”代码是这样处理的:

亮点在这里哦:

DBName=$(db2 list db directory|awk -v dba='MYDB' '/^ Database alias[ ]*=/{if(dba==$NF){flag=1}}/^ Database name[ ]*=/{if(flag==1){printf "%s",$NF;exit}}')

DBPath=$(db2 list db directory|awk -v dba='MYDB' '/^ Database alias[ ]*=/{if(dba==$NF){flag=1}}/^ Local database directory[ ]*=/{if(flag==1){printf "%s",$NF;exit}}')

awk的主体块(Body Block)
主体部分的语法要求如下:

/pattern/ {awk-commands}

  对于每一个输入的行都会执行一次主体部分的命令。默认情况下,对于输入的每一行,AWK 都会很执行命令。但是,我们可以将其限定在指定的模式中。 注意,在主体块部分没有关键字存在。
所以上面的示例,当匹配到以‘ Database alias’开头的行后,判断他最后一个域是否等于MYDB,如果等于的话,flag设置为1;然后继续匹配下面的行,匹配到‘Database name’开头的行后,判断flag等于1的话,就输出,因为可能下面还会继续匹配到‘ Database name’开头的行,但我们只需要紧相邻的行,所以要记得print完了之后exit。

进阶:

需求: 就是我需要检查db2dart导出的文件的column的顺序,获取Column 1:之后的这行Value,然后输出所有的Value。
Record Type= Table Data Record

            Slot 3:

               Offset Location = 2868  (xB34)
               Record Length = 48  (x30)

               Record Type = Table Description Record

                  Number of Columns = 5


                  Column 1:
                  Type is Long Integer
                  Length = 4
                  Prohibits NULLs
                  Prohibits Default
            Fixed offset: 0

                  Column 2:
                  Type is Variable Length Character String
                  Maximum Length = 20
                  Allows NULLs
                  Prohibits Default
            Fixed offset: 4
          Fixed offset: 4

                  Column 3:
                  Type is Small Integer
                  Length = 2
                  Allows NULLs
                  Prohibits Default
            Fixed offset: 9

                  Column 4:
                  Type is Variable Length Character String
                  Maximum Length = 200
                  Allows NULLs
                  Prohibits Default
            Fixed offset: 12

                  Column 5:
                  Type is Fixed Length Character String
                  Length = 4
                  Allows NULLs
                  Prohibits Default
            Fixed offset: 17

            Slot 4:

               Offset Location = 2742  (xAB6)
               Offset Location = 2742  (xAB6)
               Record Length = 126  (x7E)

               Record Type = Table Data Record (FIXEDVAR) (PUNC)

               Record Flags = 0

               Fixed part length value = 22

                  Column 1:
            Fixed offset: 0
                  Type is Long Integer
                  Value = 3001

                  Column 2:
            Fixed offset: 4
                  Type is Variable Length Character String
                  Length = 6 Offset = 22
                      74344C54 5434                          t4LTT4          


                  Column 3:
            Fixed offset: 9
                  Type is Small Integer
                  Value = 0

                  Column 4:
            Fixed offset: 12
                  Type is Variable Length Character String
                  Length = 90 Offset = 28
                      54347434 54347434 54347434 54347434    T4t4T4t4T4t4T4t4
                54347434 54347434 54347434 74347434    T4t4T4t4T4t4t4t4
                74347434 74347434 74346173 6466736B    t4t4t4t4t4asdfsk
                64666166 61736673 66736466 61736466    dfafasfsfsdfasdf
                6A736164 666C6120 73207366 64617364    jsadfla s sfdasd
                66736466 61647366 6173                 fsdfadsfas      


                  Column 5:
            Fixed offset: 17
                  Type is Fixed Length Character String
                      62656E6B                               benk            


            Slot 5:

上面是文件的部分示例,现在就是要取出这个文件中我们需要的部分。

awk使用案例

示例1:

$(echo "${_output}"|tail -1|awk '{if($1~"^[-,0-9]*$"){printf "%d",$1}else{printf "%d",5}}')
[db2inst1@bogon tmp]$ db2 "force application all"
DB20000I  The FORCE APPLICATION command completed successfully.
DB21024I  This command is asynchronous and may not be effective immediately.

示例2

[db2inst1@bogon tmp]$ echo '-1316,-1017'|awk -F, -v c='-1316' '{for(i=1;i<=NF;i++){if($i==c && c!=0){f=1}}}END{if(f==1){printf 100}else{printf "%d",c}}' 
100

这个代码不好看懂的话我们整理格式化一下:

awk -F, -v c='-1316' '
{for(i=1;i<=NF;i++)
  {if($i==c && c!=0)
    {f=1}
  }
}
END{if(f==1)
       {printf 100}
    else
       {printf "%d",c}
   }' 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值