У меня есть это
ciscoFlashCopyStatus OBJECT-TYPE SYNTAX INTEGER { copyOperationPending(0), copyInProgress(1), copyOperationSuccess (2), copyInvalidOperation (3), copyInvalidProtocol (4), copyInvalidSourceName (5), copyInvalidDestName (6), copyInvalidServerAddress (7), copyDeviceBusy (8), copyDeviceOpenError (9), copyDeviceError (10), copyDeviceNotProgrammable (11), copyDeviceFull (12), copyFileOpenError (13), copyFileTransferError(14), copyFileChecksumError(15), copyNoMemory (16), copyUnknownFailure(17), copyInvalidSignature(18) } MAX-ACCESS read-only STATUS currentЧто я хочу сделать
Некоторая команда для копирования каждого имени VARIABLE в массив с именем var
Итак, пример вывода
echo "${var[0]} copyOperationPending echo "${var[1]} copyInProgress echo "${var[2]} copyOperationSuccess and so on..Любые идеи, как я могу это достичь?
ПРИМЕЧАНИЕ. Это своего рода аналогичный вопрос, который я задал раньше, как когда-либо изменилось, и я больше не может использовать то же решение, что и в старом вопросе.
Вы можете grep только строки с полями и использовать sed, чтобы удалить все после открытия скобки. Полученный список слов можно использовать непосредственно для заполнения массива:
var=($(grep input-file ' *[a-zA-Z]\+ \?([0-9]\+)' | sed 's/(.*//'))
echo ${var[1]}
Регулярное выражение, используемое в grep:
space + *: любое количество пробелов ( в том числе 0) [a-zA-Z]\+: любое количество букв (не менее 1) пробел + \?: необязательное пространство (: левая скобка [0-9]\+: любое количество цифр (не менее 1) ): правая скобка [ ! d2]Для конкретного файла, который вы показываете, если вам просто нужны строки, начинающиеся с copy, достаточно сделать:
var=( $(grep -o 'copy[^(]*' file) )
У вас есть:
$ for((i=0;i<${#var[@]};i++)); do echo "${var[i]}"; done
copyOperationPending
copyInProgress
copyOperationSuccess
copyInvalidOperation
copyInvalidProtocol
copyInvalidSourceName
copyInvalidDestName
copyInvalidServerAddress
copyDeviceBusy
copyDeviceOpenError
copyDeviceError
copyDeviceNotProgrammable
copyDeviceFull
copyFileOpenError
copyFileTransferError
copyFileChecksumError
copyNoMemory
copyUnknownFailure
copyInvalidSignature
awk метод:
ARRAY=($(awk 'BEGIN{ORS=" "} /SYNTAX/ && /INTEGER/,/MAX-ACCESS/ {gsub(/SYNTAX|INTEGER|MAX-ACCESS.*|[[:blank:]]|{|}/,"");gsub(/\(/," (");for (i=1;i<=NR;i++) {if ($i~/\(|\)/) $i="" };print}' testfile.txt))
Объяснение:
Мы настроили структуру ARRAY = (...) с подстановкой команд $ (... ) внутри него, чтобы поймать вывод внутренней команды awk в массив. Распечатайте все из строки, в которой есть SYNTAX и INTEGER (чтобы избежать случаев, когда между SYNTAX и INTEGER неизвестно), до MAX-ACCESS. удалите слова SYNTAX, INTEGER, MAX-ACCESS и все, что следует за ним, удалите пустые строки и две фигурные скобки. Измените переменные из переменной (1) в переменную (1), т. Е. Разделите их пробелом. На этом этапе мы разделим эти поля на два. Пройдите в цикл, чтобы найти поля, в которых есть фигурные скобки, и удалите их. Вы можете спросить, что, если поле содержит пробелы, например (1) или (1)? Разве это не удалялось бы только (1 в последнем примере? Ну, мы удалили пробелы до этого шага, поэтому это должно быть безопасно. Наконец, распечатайте все, разделите пространство вместо стандартной по умолчанию для разделителя выходной записи. массивПояснение
Давайте поместим все в скрипт awk:
#!/usr/bin/awk -f
BEGIN{ORS=" "}
/SYNTAX/ && /INTEGER/,/MAX-ACCESS/ {
gsub(/SYNTAX|INTEGER|MAX-ACCESS.*|[[:blank:]]|{|}/,"");
gsub(/\(/," (");
for (i=1;i<=NR;i++) {
if ($i~/\(|\)/) $i=""
};
print }
Сохраним этот исполняемый файл сценария, и выполните так:
$ ARRAY=($(./varscript.awk testfile.txt ))
$ echo ${ARRAY[0]}
copyOperationPending
$ echo ${ARRAY[1]}
copyInProgress
$ echo ${ARRAY[*]}
copyOperationPending copyInProgress copyOperationSuccess copyInvalidOperation copyInvalidProtocol copyInvalidSourceName copyInvalidDestName copyInvalidServerAddress copyDeviceBusy copyDeviceOpenError copyDeviceError copyDeviceNotProgrammable copyDeviceFull copyFileOpenError copyFileTransferError copyFileChecksumError copyNoMemory copyUnknownFailure copyInvalidSignature
Использование gawk
var=($(gawk '/{/,/}/ {if ($0 ~ /copy/) {match ($0, "[[:alpha:]]+", a); printf "%s\n",a[0]}}' <your_file>))
Использование perl
var=($(perl -ne 'if (/copy/) {s/\s*([[:alpha:]]*).*/$1/g; printf "%s\n",$_}' <your_file>))
Пример
awk [ ! d5]
$ var=($(gawk '/{/,/}/ {if ($0 ~ /copy/) {match ($0, "[[:alpha:]]+", a); printf "%s\n",a[0]}}' foo))
$ for((i=0;i<${#var[@]};i++)); do echo "${var[i]}"; done
copyOperationPending
copyInProgress
copyOperationSuccess
copyInvalidOperation
copyInvalidProtocol
copyInvalidSourceName
copyInvalidDestName
copyInvalidServerAddress
copyDeviceBusy
copyDeviceOpenError
copyDeviceError
copyDeviceNotProgrammable
copyDeviceFull
copyFileOpenError
copyFileTransferError
copyFileChecksumError
copyNoMemory
copyUnknownFailure
copyInvalidSignature
perl
$ var=($(perl -ne 'if (/copy/) {s/\s*([[:alpha:]]*).*/$1/g; printf "%s\n",$_}' foo))
$ for((i=0;i<${#var[@]};i++)); do echo "${var[i]}"; done
copyOperationPending
copyInProgress
copyOperationSuccess
copyInvalidOperation
copyInvalidProtocol
copyInvalidSourceName
copyInvalidDestName
copyInvalidServerAddress
copyDeviceBusy
copyDeviceOpenError
copyDeviceError
copyDeviceNotProgrammable
copyDeviceFull
copyFileOpenError
copyFileTransferError
copyFileChecksumError
copyNoMemory
copyUnknownFailure
copyInvalidSignature
cat foo
ciscoFlashCopyStatus OBJECT-TYPE
SYNTAX INTEGER
{
copyOperationPending(0),
copyInProgress(1),
copyOperationSuccess (2),
copyInvalidOperation (3),
copyInvalidProtocol (4),
copyInvalidSourceName (5),
copyInvalidDestName (6),
copyInvalidServerAddress (7),
copyDeviceBusy (8),
copyDeviceOpenError (9),
copyDeviceError (10),
copyDeviceNotProgrammable (11),
copyDeviceFull (12),
copyFileOpenError (13),
copyFileTransferError(14),
copyFileChecksumError(15),
copyNoMemory (16),
copyUnknownFailure(17),
copyInvalidSignature(18)
}
MAX-ACCESS read-only
STATUS current