Хинду является немного особенным... ;-)
Это будет зависеть от источника. Если Вам будет нужен некоторый специальный инструмент - awk, sed, гибкий провод... - для обрабатывания/генерирования некоторой части исходного кода для программы, то Вам будут нужны эти инструменты для компилирования/создавания его... Однако, после того как программа создается - т.е. у Вас есть некоторый исполняемый файл - эти инструменты не нужны для использования программы.
То же идет для программ, где части записаны на необычных языках. Если части программы записаны в Ocaml, Ada или Паскале; Вам будут нужны подходящие компиляторы для этих установленных языков. После того как они скомпилированы в объектные файлы и связаны в законченный исполняемый файл, только общие библиотеки необходимы - если он не был создан со статическими библиотеками, в этом случае даже библиотеки не будут необходимы.
Даже некоторой части документации, возможно, иногда понадобятся дополнительные инструменты и установленные программы - как что-то записанное в ЛАТЕКСЕ и таким образом нуждающийся в ЛАТЕКСЕ, который будет создан. В конце концов, даже простые страницы справочника нуждается в TROFF к междерзкому используемый язык разметки.
Для других дистрибутивов, чем хинду - дистрибутивов, где Вы не создаете все сами - Вы не должны волноваться об инструментах, необходимых во время здания, так как пакеты являются pre-buildt.
Краткий ответ, который еще не упоминается в awk
awk '/Node/{n=$2; getline; print n " "$2; next}' filename
/ Node /
# Ищите узел Pattern и храните второе поле в N
Переменная n = $ 2
getline
# Переместить на следующую строку (именно здесь работает logical
строка), напечатайте то, что хранится в n
, а затем Второе поле следующей строки. Далее
# Остановите обработку текущей записи и перейдите к следующему. Если вы хотите 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}'
Причина, по которой он изменится, потому что вы печатаете только переменные, которые вы захватите один раз, в конце {}
блока. Это означает, что только последние два будут напечатаны. @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}'
. В качестве альтернативы, вы можете использовать другие инструменты:
GNU GREP / PERL
Rescadm Chest | GreeP -PO '^ \ S * (узел | логический) \ s * \ k. *? (\ s | $) файл |
Perl -lne '$. % 2? printf: print '
Perl
Rescadm зонд |
Perl -ne 'Chomp; если (S / .* (WWN :. *?) \ S. * / $ 1 / || S / .* (путь :. *?) $ / $ 1 \ n /) {print}'
Вы должны использовать 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.