Добавьте определенные строки в массив sed / awk / grep

У меня есть это

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..

Любые идеи, как я могу это достичь?

ПРИМЕЧАНИЕ. Это своего рода аналогичный вопрос, который я задал раньше, как когда-либо изменилось, и я больше не может использовать то же решение, что и в старом вопросе.

1
задан 30 June 2015 в 14:27

4 ответа

Вы можете 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]
3
ответ дан 23 May 2018 в 19:21

Для конкретного файла, который вы показываете, если вам просто нужны строки, начинающиеся с 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
2
ответ дан 23 May 2018 в 19:21

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
2
ответ дан 23 May 2018 в 19:21

Использование 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 
1
ответ дан 23 May 2018 в 19:21

Другие вопросы по тегам:

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