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}
}'