2013-04-26 3 views
1

У меня есть огромная куча файлов журналов, постоянно обновляемых на сервере HP-UX. Я создал код Perl, чтобы узнать имя файла журнала, в котором строка i ' м, находящийся внутри. Perl получает имя файла, используя разделение и передает его в variable.Using в UserInput я создать начало и остановку строки как два variables.Such как:Использовать awk в Perl, чтобы разобрать все между двумя строками

my $ssh = Net::OpenSSH->new($host, user => $user, 
     master_opts => [ -o => 'NumberOfPasswordPrompts=1', 
         -o => 'PreferredAuthentications=keyboard-interactive,password'], 
login_handler => \&login_handler); 

$ssh-> error and die "Unable to connect" . $ssh->error; 
my $output=$ssh->capture("grep .$userinput1. /app/bea/user_projects/domains/granite/om_ni.log*"); 

my $array = (split ":", $output)[0]; 
print "$array"."\n"; 

[EDIT]: В соответствии с просьбой, вы, ребята, выше начало как $ массива получил заполненный in.Below, где начинается последовательность AWK:

my $a= "INFO - $userinput1";print $a; 
my $b= "INFO - ProcessNode terminated... [$userinput1]";print $b; 

Использование AWK, как часть команды захвата SSH, она будет искать через весь лог-файл и захватить каждую линию между string $ a и string $ b, затем получить все внутри другого массива. Такие как:

my $output2=$ssh->capture("awk -v i=$array '$a,$b' i"); 

Здесь $ array - это то, где полный путь файла журнала хранится, и он работает полностью как передающая переменная. Я пробовал использовать awk без параметра -v, не имеет значения.

[EDIT 2]: это результат печати «$ array». "\ N";

/app/bea/user_projects/domains/granite/om_ni.log.2 

Когда я запускаю сценарий Perl, я получаю результат:

INFO - 28B26AD1-E959-4F5F-BD89-A7A6E601BE18INFO - ProcessNode terminated... [28B26AD1-E959-4F5F-BD89-A7A6E601BE18] syntax error The source line is 1. 
The error context is 
INFO - 28B26AD1-E959-4F5F-BD89-A7A6E601BE18,INFO - ProcessNode >>> terminated. <<< .. [28B26AD1-E959-4F5F-BD89-A7A6E601BE18] 
awk: Quitting 
The source line is 1. 

Ошибка указывает на слово «прекратить» так или иначе, но даже когда я использую управляющие символы во всем струнам, он просто Безразлично Не волнуйся и возвращай ту же ошибку.

Любая помощь по этому вопросу высоко ценится. Спасибо заранее.

+0

Было бы неплохо увидеть полный код. Вы выполняете '$ ssh-> login' перед' capture'? –

+0

Мы не видим всю вашу команду, потому что вы не показали нам, что такое '$ array'. Предложение: добавьте это в свой скрипт 'print 'awk -v i = $ array' $ a, $ b 'i" 'и посмотрите, как выглядит команда, которую вы пытаетесь запустить. Это может сделать ошибку очевидной. Но если нет, пожалуйста, обновите вопрос, чтобы включить точную команду, которую вы выполняете (вывод инструкции печати). – 2013-04-26 09:38:55

+0

@DmitryMina, это ошибка Awk, поэтому кажется, что соединение SSH работает. – 2013-04-26 10:48:51

ответ

0

Хотя я действительно не знаю awk, то, как вы его вызываете, кажется неправильным. Here is the manual for awk on HP-UX.

Часть в одинарных кавычках ($a,$b) должна быть программой. Однако вы передаете ему две текстовые строки, которые даже не цитируются, чтобы их разделить. Это не действительная awk-программа; следовательно, синтаксическая ошибка.

Я думаю, что вы хотите что-то вроде '/$a/, /$b/' для программы (но опять же, я не эксперт awk).

Кроме того, вы устанавливаете имя файла переменной i, а затем используете i вместо имени файла при вызове команды. Я не знаю, почему вы это делаете, и я не думаю, что даже будет работать с переменной в имени файла. Просто используйте $array (для ясности вы должны переименовать что-то вроде $file) в позиции имени файла.

Так вся ваша команда должна выглядеть примерно так:

"awk '/$a/,/$b/' $file" 

В одной команде, вы имеете дело с тремя различными инструментами: Perl, SSH, и AWK. Это очень сложно отладить, потому что, если есть проблема, трудно определить, где проблема. Очень важно, чтобы вы разбили задачу на более мелкие части, чтобы получить что-то вроде этого.

В этом случае это означает, что вы должны вручную SSH на сервере и играть с awk, пока не получите команду справа. Только когда вы уверены, что у вас есть команда awk, если вы попытаетесь включить ее в Perl. Это будет намного проще, если вы нарушите задачу таким образом.

+0

Hi dan, Спасибо за потратив ваше время и помогая мне. К сожалению, использование этого синонима было первым, что я пробовал, и это вообще не имеет значения. Это перспектива регулярного выражения, и awk, похоже, не подходит для сред HP-UX Я пробовал несколько разных вещей на скриптах bash с использованием awk, он просто не работает. Я, вероятно, буду менять свой код на использование парсера цикла Perl. Большое спасибо. – MertD

+0

@MertD , если вы хотите, чтобы awk работал, кто-то, вероятно, мог бы помочь вам, если вы напишете вопрос о команде awk. Cheers. – 2013-04-29 09:12:16

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