Regex 正则表达式哪里出了问题
我有一个查询,结果是以下数据 查询:Regex 正则表达式哪里出了问题,regex,perl,Regex,Perl,我有一个查询,结果是以下数据 查询: db2 "select RTRIM(substr(A.TBSP_NAME,1,30)),A.TBSP_FREE_PAGES as FREE,B.CONTAINER_NAME as CON_PATH from SYSIBMADM.TBSP_UTILIZATION A ,SYSIBMADM.CONTAINER_UTILIZATION B where A.TBSP_ID=B.TBSP_ID and A.TBSP_AUTO_RESIZE_ENABLED=0 with
db2 "select RTRIM(substr(A.TBSP_NAME,1,30)),A.TBSP_FREE_PAGES as FREE,B.CONTAINER_NAME as CON_PATH from SYSIBMADM.TBSP_UTILIZATION A ,SYSIBMADM.CONTAINER_UTILIZATION B where A.TBSP_ID=B.TBSP_ID and A.TBSP_AUTO_RESIZE_ENABLED=0 with UR"
结果:
1 FREE CON_PATH
------------------------------ -------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
USERSPACE1 14736 /adrst/bdts/userspc_container
USERSPACE1 14736 /adrst/bdts/userspc_container1
MASTER 3472 /adrst/bdts/master_container
TRANS_DATA 1200 /adrst/bdts/trans_data_container
MASTER_INDEX 1840 /adrst/bdts/master_index_container
TRANSACTION_INDEX 960 /adrst/bdts/transaction_index_container
TEMP_SYS 2192 /adrst/bdts/temp_sys_container
AUDIT_DATA 3360 /adrst/bdts/audit_data_container
TEMP_USR 2672 /adrst/bdts/temp_usr_container
TSASNCA 2840 /home/db2inst1/db2inst1/NODE0000/SQL00002/TSASNCA
TSASNUOW 2880 /home/db2inst1/db2inst1/NODE0000/SQL00002/TSASNUOW
TSASNAA 3712 /home/db2inst1/db2inst1/NODE0000/SQL00002/TSASNAA
TSCDADDRESSMASTER 2048 /home/db2inst1/db2inst1/NODE0000/SQL00002/CDADDRESSMASTER
13 record(s) selected.
现在我正在写一个脚本,它取第2列并比较,如果<1000,那么我们在打印中提到col1和col2
所以我写的剧本是
#!/usr/bin/perl
use strict;
use warnings;
`db2 "connect to awdrt"`;
my @tbsp= grep /([a-zA-Z_]*)\s*([0-9]*)\s*([a-zA-Z_]*)/,`db2 "select RTRIM(substr(A.TBSP_NAME,1,30)),A.TBSP_FREE_PAGES as FREE,B.CONTAINER_NAME as CON_PATH from SYSIBMADM.TBSP_UTILIZATION A ,SYSIBMADM.CONTAINER_UTILIZATION B where A.TBSP_ID=B.TBSP_ID and A.TBSP_AUTO_RESIZE_ENABLED=0 with UR"`;
print "@tbsp";
我已经打印出来测试我是否成功地消除了“---”第1行和最后一行…这样我就可以拆分并初始化为3个变量,并在foreach循环中进行计算,但在某个地方出错了……。非常感谢您的帮助您可以在单个grep中包括对空闲>1000行的筛选,如下所示:
# loop over the query output
for (`db2 "select ...`) {
if (my ($c0, $c1, $c2) = /(\w+)\s*(\d+)\s*([\w\/]+)/) {
print "$c0,$c1,$c2\n";
}
}
#!/usr/bin/perl
use strict;
use warnings;
my @lines = <DATA>;
my @filtered = grep {/(\S+) # non-space characters
\s+ # one or more spaces
(\d+) # numeric characters
\s+ # one or more spaces
(\S+) # non-space characters
/x,
$2 > 1000 # filter by FREE > 1000
} @lines;
换句话说,首先用正则表达式过滤数据行,然后只返回FREE>1000的行。我得到了我所问问题的解决方案
#!/usr/bin/perl
use strict;
use warnings;
my $good = "\[\033[32mOK\033[0m\]";
my $bad = "\[\033[31m!!\033[0m\]";
`db2 "connect to awdrt"`;
my @tbsp= grep /\//,`db2 "select RTRIM(substr(A.TBSP_NAME,1,30)),A.TBSP_FREE_PAGES as FREE,B.CONTAINER_NAME as CON_PATH from SYSIBMADM.TBSP_UTILIZATION A ,SYSIBMADM.CONTAINER_UTILIZATION B where A.TBSP_ID=B.TBSP_ID and A.TBSP_AUTO_RESIZE_ENABLED=0 with UR"`;
foreach (@tbsp){
chomp;
s/^\s*//;
s/\s*$//;
my ($col1,$col2,$col3)=split /\s+/,$_,3;
if ($col2 <= 2000){
print "$bad $col1 has $col2 pages with container $col3\n";
#print "alter tablespace $col1 extend (file \'$col3\' 1000)\n";
}
}
工作正常…………谢谢大家你在哪里检查<1000?为什么不使用?你的正则表达式匹配,因为所有的星星都是空行。它还匹配所有可能存在的字符串。一旦我成功地消除了顶行和底行,我将检查<1000,只想检查grep是否给出了所需的O/p,所以…….耶,我已经用DBD::DB2编写了脚本,它工作正常,只想不用它进行尝试,实际上,我试图掌握一些正则表达式,所以…………我不像shell那么舒服,因为我大约一周前开始使用它,所以我不能得到一个正则表达式,它有助于将一个名称后接一个数字后接一个字符串……?见第1列,不必像我所示的那样以数字1开头,如果我给它取别名,它可能会有一个名称,这个正则表达式在某一点上有效吗?可能是我可以使用一些正则表达式来初始化它3个变量,看,我只是在猜测我自己…建议很感激我使用正则表达式/\/,所以我可以得到我想要的数据,所以我如何使用foreach或其他任何东西初始化它变量…?@mViswa,好的,这个就可以了