соответствие и слияние строк с awk и печать с Солярисом

Хинду является немного особенным... ;-)

Это будет зависеть от источника. Если Вам будет нужен некоторый специальный инструмент - awk, sed, гибкий провод... - для обрабатывания/генерирования некоторой части исходного кода для программы, то Вам будут нужны эти инструменты для компилирования/создавания его... Однако, после того как программа создается - т.е. у Вас есть некоторый исполняемый файл - эти инструменты не нужны для использования программы.

То же идет для программ, где части записаны на необычных языках. Если части программы записаны в Ocaml, Ada или Паскале; Вам будут нужны подходящие компиляторы для этих установленных языков. После того как они скомпилированы в объектные файлы и связаны в законченный исполняемый файл, только общие библиотеки необходимы - если он не был создан со статическими библиотеками, в этом случае даже библиотеки не будут необходимы.

Даже некоторой части документации, возможно, иногда понадобятся дополнительные инструменты и установленные программы - как что-то записанное в ЛАТЕКСЕ и таким образом нуждающийся в ЛАТЕКСЕ, который будет создан. В конце концов, даже простые страницы справочника нуждается в TROFF к междерзкому используемый язык разметки.

Для других дистрибутивов, чем хинду - дистрибутивов, где Вы не создаете все сами - Вы не должны волноваться об инструментах, необходимых во время здания, так как пакеты являются pre-buildt.

2
12.04.2015, 00:46
4 ответа

Краткий ответ, который еще не упоминается в awk

awk '/Node/{n=$2; getline; print n " "$2; next}' filename
  • / Node / # Ищите узел Pattern и храните второе поле в N Переменная n = $ 2
  • getline # Переместить на следующую строку (именно здесь работает logical строка), напечатайте то, что хранится в n , а затем Второе поле следующей строки.
  • Далее # Остановите обработку текущей записи и перейдите к следующему.
3
27.01.2020, 21:50

Если вы хотите awk

awk -v RS=' Node ' -v FS=' Logical Path:| ' '/WWN/{print $1,$6}'

Другое (может быть простым)

awk -F":| " '/Node/{printf "%s ", $3":"$4}/Logical Path/{print $4}'

с оставшись Путь:

awk '/Node/{printf "%s ", $2}/Logical Path/{print $2}'

или

awk '/Node/{wwn=$2}/Logical Path/{print wwn,$2}'

и GNU наконец-то :

sed -n '/WWN/{s/^\s*\S* *\|\( \S*\)\{3\}\s*$//g;N;s/\n\s*\S*//;p}'
1
27.01.2020, 21:50

Причина, по которой он изменится, потому что вы печатаете только переменные, которые вы захватите один раз, в конце {} блока. Это означает, что только последние два будут напечатаны. @Costas уже дал вам более элегантный подход, но вы также можете использовать ту же логику, которую вы пытаетесь с небольшим изменением:

awk '{ if(/Node/){
        if(length(n)){print n,l} ## if we have an n, print them
        n=$2
        }
        if(/Logical/){l=$2}
      } 
        END {print n,l}' 

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

  1. GNU GREP / PERL

     Rescadm Chest |  GreeP -PO '^ \ S * (узел | логический) \ s * \ k. *? (\ s | $) файл |
      Perl -lne '$.  % 2?  printf: print '
     
  2. Perl

     Rescadm зонд |
      Perl -ne 'Chomp; если (S / .* (WWN :. *?) \ S. * / $ 1 / || S / .* (путь :. *?) $ / $ 1 \ n /) {print}'
     
3
27.01.2020, 21:50

Вы должны использовать SED , на мой взгляд. Во-первых, он обычно превосходит awk , и, в этом случае, он предлагает более простое решение в целом:

sed -n 'N;s/Node \([^ ]*\).*Logical/\1/p' <infile

... который, учитывая ваш пример данных, печатает ...

 WWN:2000000c50f1c8da Path:/dev/rdsk/c1t1d0s2
 WWN:2000000c50f1d9c9 Path:/dev/rdsk/c1t0d0s2

Для каждой строки прочитано SED также получает n n n n, добавляемый к пространству шаблона после вставленного \ N разделитель EWLINE. Таким образом, вышеупомянутое S /// /// UBStitution SPANS Две строки и печатает два поля, которые вы хотите, разделенные только пространством, и только при обнаружении совпадения.

Вышеуказанное SED SED синтаксис должен быть полностью портативным для любой системы POSIX.

2
27.01.2020, 21:50

Теги

Похожие вопросы