2015-12-14 2 views
1

Я следующий вывод (в Linux):Linux Разбор вывода и объединение линий

wwn = 5001248018b6d7af 
node_wwn = 5001248018b6d7ae 
wwn = 5001248118b6d7af 
node_wwn = 5001248118b6d7ae 

Мне нужно разобрать выход поэтому он будет выглядит следующим образом:

50:01:24:80:18:b6:d7:ae:50:01:24:80:18:b6:d7:af 
50:01:24:81:18:b6:d7:ae:50:01:24:81:18:b6:d7:af 

выход является node_wwn и его wwn.

Я сделал это задание, используя какое-то приложение C#, но его слишком сложно вывести и пропустить его в программу.

string command = "cat /proc/sll/info |grep -B 9 up| grep wwn"; 
     string temp; 
     string []commandOutput; 
     string[] wwns; 
     string[] wwpns; 

     hbaList = new List<HBA>(); 

     commandOutput = (exec.RunCommand(command)).Trim().Split('\n'); 

     wwns = Array.FindAll(commandOutput, item => item.StartsWith("wwn = ")); 
     wwpns = Array.FindAll(commandOutput, item => item.StartsWith("node_wwn = ")); 

     for (int i =0; i<wwns.Length;i++) 
     { 
      hba = new HBA(); 

      temp = string.Format("{1}", (wwpns[i].Split('='))).Trim(); 
      temp += string.Format("{1}", (wwns[i].Split('='))).Trim(); 
      temp = Regex.Replace(temp, ".{2}", "$0:"); 
      temp = temp.Remove(temp.Length - 1); 
      hba.ID = temp; 
      hbaList.Add(hba); 
     } 

Пожалуйста, помогите ...

Благодаря Almog

+1

разместить свои попытки .. –

+0

Сообщения спасибо ,,, я не знакомые с командами Linux разбора как SED и AWK ... помощь, пожалуйста, – almog50

+0

Почему вы используете 'grep -B9'? Какой еще результат, который вы нам не показываете? Вся задача может быть легко обработана одним скриптом Awk, но нам нужно понять ожидаемый ввод. – tripleee

ответ

1

написания кода службы, привет :)

Я сделал это с GNU AWK.

#!/usr/bin/env awk -f 

function out_wwn(wwn, node_wwn) { 
    out = sprintf("%s%s", node_wwn, wwn); 
    patsplit(out, a, "[0-9a-f]{2}"); 
    for (i = 1; i <= length(a); i++) { 
     if (i > 1) printf(":"); 
     printf("%s", a[i]); 
    } 
    printf("\n"); 
} 

/^wwn/ {wwn=$3} 
/^node_wwn/ {out_wwn(wwn, $3)} 

Использование в вашем случае:

cat /proc/sll/info |grep -B 9 up| awk -f [the file above] 

Может быть, вы также можете удалить первый grep, в зависимости от вашего входа. В этом случае вам нужно просто сделать:

awk -f [the file above] < /proc/sll/info 
+0

:) Спасибо за отличную услугу ... – almog50

+0

@ almog50 спасибо, спасибо вместо этого, и верность;) – cadrian

+0

«Кот» и, как вы заметили, вероятно, 'grep' тоже [бесполезно] (http: // www.iki.fi/era/unix/award.html). – tripleee

1

Гадание немного здесь ...

awk '$1 == "wwn" { result = $3; next } 
    $1 == "node_wwn" { result = $3 result; next } 
    /up/ { for(i=1, sep = ""; i<length(result); sep = ":", i += 2) 
     printf("%s%s", sep, substr(result, i, 2)); 
     printf "\n" }' /proc/sll/info 

Предполагая, что wwn всегда будет предшествовать node_wwn и следовать up до следующего выхода записи, и что шаблоны пробелов согласованы.

0

Вот Perl версии

while (<>) { 
    if ($_ =~ /(node_)*wwn\s*=\s*(\S+)/) { 
     $node = "$2$node"; 
     if($1 eq "node_") { 
      $node =~ s/(..)(?!$)/\1:/g; 
      print "$node\n"; 
      $node = ""; 
     } 
    } 
} 
0

Это может работать для вас (GNU СЭД):

sed -r 'N;s/.* = (\S+).* = (\S+).*/\2\1/;s/..\B/&:/g' file 

Это читает две строки во время, удаляет хлама и повторно упорядочивает данные затем вставляет a : между двумя символами, за которыми следует неглавная граница.

0

Просто выбрасывать другой вариант.

Это предполагает node_wwn линия непосредственно следует WWN линии ..

$ cat file 
wwn = 5001248018b6d7af 
node_wwn = 5001248018b6d7ae 
wwn = 5001248118b6d7af 
node_wwn = 5001248118b6d7ae 

$ awk '$1=="wwn"{nf=$NF;getline;print $NF""nf}' file | perl -pe 's/\w{2}\B/$&:/g' 
50:01:24:80:18:b6:d7:ae:50:01:24:80:18:b6:d7:af 
50:01:24:81:18:b6:d7:ae:50:01:24:81:18:b6:d7:af 
Смежные вопросы