主体部分的语法要求如下:
/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/db2inst1grep了两次,还是有点儿繁琐的哈,后面看到了“别人家的”代码是这样处理的:
亮点在这里哦:
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 -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} }'