2013-02-19 5 views
0
System Database Directory 

Number of entries in the directory = 3 

Database 1 entry: 

Database alias      = Sample 
Database name      = sample 
Local database directory    = /home/db2inst1 
Database release level    = b.00 
Comment        = 
Directory entry type     = Indirect 
Catalog database partition number = 0 
Alternate server hostname   = 
Alternate server port number   = 

Database 2 entry: 

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

Database 3 entry: 

Database alias      = sample3 
Database name      = sample 
Local database directory    = /home/db2inst1 
Database release level    = b.00 
Comment        = 
Directory entry type     = Indirect 
Catalog database partition number = 0 
Alternate server hostname   = 
Alternate server port number   = 

У меня есть следующий текст при выполнении системной команды. Я хочу только sample,sample2,sample3 как выход. Я знаком с этим в оболочке, но я новичок в perl.Как я могу получить желаемый результат?

ответ

2

Вы можете использовать опцию -n в однострочника с ручкой STDIN посылаться через канал:

yourcommand | perl -F'\s*=\s*' -anlwe '/Database alias/ && print $F[1]' 

Это просто раскол (-a) на регулярное выражение /\s*=\s*/, который будет разделен на знак равенства и полосы окружающие пробелы. Когда целевой текст найден, он печатает второе поле, которое должно быть вашей строкой.

+0

Wow я получил его, спасибо многому человеку @TLP, я просто хочу знать, как мы вставляем в скрипт, так как это дело командной строки, выше того, где я могу найти пример для такого рода обработки текста – mviswa

+0

"Сценарий"? Что это за сценарий? Если вы хотите, запустите это с помощью переключателя '-MO = Deparse', чтобы увидеть полный код. – TLP

0

Вы можете использовать команды оболочки в открытом так:

open(IN,"cmd_that_generate_the_output|grep -i 'Database alias'|cut -f2 -d'='|cut -f2 -d' '|") or die; 
while (my $str = <IN>){ 
    print "str: $str\n"; 
} 
+0

Мне комфортно с оболочкой, на самом деле это скрипт, уже запущенный на наших серверах prod без каких-либо проблем, все, что я изучаю, как я делаю что-то в Perl, оставаясь вне команд оболочки. спасибо за ваше время, я ценю это – mviswa

1

Решение это лишь незначительная модификация this answer. В принципе, вы хотите, чтобы четвертый столбец каждой строки начинался с «Алиас базы данных». Вы можете использовать Perl grep функцию, чтобы выбрать соответствующие строки, а затем выполнить выбор из solution упомянутых выше:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $file = shift; 
my @aliases; 

open FILE, $file or die "Cannot open input file"; 

chomp (my @lines = grep /^Database alias/, <FILE>);  

close FILE; 

for my $row (@lines) {     
    my @columns = split /\s+/, $row; 
    push @aliases, $columns[3]; 
} 

print join "\n", @aliases; 

Если ваш входной файл большой, я рекомендую пройти через файл, используя while петли и фильтрации данных, не -мачивание линий на лету. Такой подход не сохранит весь файл в памяти.

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