2013-03-08 3 views
-1

У меня есть запрос, который приведет к следующим даннымЕсли регулярное выражение будет неправильно

Запрос:

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'st строки и последнюю строку ... так что я могу раскол и инициализировать 3 переменных и сделать мой расчет в цикле Еогеасп, но где-то идет не так ........ Помощь ценится

+0

Где вы проверяете '<1000'? –

+3

Почему вы не используете [DBD :: DB2] (http://search.cpan.org/perldoc?DBD::DB2)? – mvp

+0

Ваши регулярные выражения совпадают, пустые строки из-за всех этих звезд. Он также соответствует любой возможной строке. – perreal

ответ

0
# loop over the query output 
for (`db2 "select ...`) { 
    if (my ($c0, $c1, $c2) = /(\w+)\s*(\d+)\s*([\w\/]+)/) { 
    print "$c0,$c1,$c2\n"; 
    } 
} 
+0

Я не настолько удобен, как оболочка, так как я начал работать с ним неделю назад или около того, поэтому я не могу получить регулярное выражение, которое помогает в grepping имя, за которым следуют цифры, за которыми следует строка ..... .? – mviswa

+0

см. 1-й столбец, не нужно начинать с цифры «1», как я показал, она может иметь имя, если я его псевдоним, работает ли это регулярное выражение в точке ....? – mviswa

+0

может быть, я могу использовать split с некоторым регулярным выражением, чтобы инициализировать его 3 переменные, см., Что я просто догадываюсь о себе .... предложения оценены – mviswa

0

Вы можете включить фильтрацию линий, имеющих СВОБОДНО> 1000 в одном grep, например:

#!/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; 

Другими словами, первый фильтр линии передачи данных с регулярным выражением, а затем вернуться только строки, имеющие СВОБОДНО> 1000.

+0

Ничего себе, это ново для меня ......... спасибо – mviswa

0

Я получил решение на поставленный вопрос я .......

#!/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"; 
} 
} 

И его рабочий тон ... Спасибо

Смежные вопросы