Копирование некоторых частей файла

Я должен скопировать "Агент SNMP, произошел" и ":: =101" и количество количество существующих переменных (пример здесь существует 5) и помещает их в 3 Различных переменные.

FROM  FILE.TXT
sCSISmart1  TRAP-TYPE   
    ENTERPRISE  cyclone                        
    VARIABLES  { scellNameDateTime,                      
                     scellSWComponent,                     
                     scellECode,                  
                     scellCAC,                     
                     scellEIP}                           
    DESCRIPTION                             
    "SNMP Agent is up."                       
    --#TYPE "SNMP Agent is up."                    
    --#SUMMARY "SNMP Agent is up"                    
    --#ARGUMENTS {}                           
    --#SEVERITY INFORMATIONAL                       
    --#TIMEINDEX 100                  
    --#STATE OPERATIONAL                    
    --#HELP "scsismrt.hlp"                          
    --#HELPTAG 101                    
::=  101        

Что останется постоянным во всех других файлах

DESCRIPTION "  ";   
::= xxx(number);      
VARIABLES { variable1, variable2}

Любые команды SED, GREP, AWK или что-либо еще, что я могу использовать здесь, берут их из file.txt

То, в чем я нуждаюсь, - то, что я нахожу ОПИСАНИЕ и копирую текст, который появляется после него. То же для числа я нахожу:: = и текст копии после него. Для переменной я нахожу ПЕРЕМЕННУЮ и нахожу количество переменных после него.

Поэтому примите эти переменные
desc является переменным для ОПИСАНИЯ
numvar является общим количеством ПЕРЕМЕННЫХ
casenum является числом, которое прибывает после:: =

Таким образом, когда я печатаю их выше переменных затем

ВЫВОД для
переменная desc

Агент SNMP произошел.

ВЫВОД для
переменная numvar

5

ВЫВОД для
переменная casenum

101

Править
НИ ДЛЯ КАКИХ ПЕРЕМЕННЫХ

ТИП ПРЕРЫВАНИЯ sCSISmart2
Циклон ПРЕДПРИЯТИЯ
ОПИСАНИЕ
"Агент SNMP снижается".
- #TYPE "Агент SNMP снижается".
- #SUMMARY "агент SNMP снижается"
- #ARGUMENTS {}
- ИНФОРМАЦИОННЫЙ #SEVERITY
- #TIMEINDEX 100
- ОПЕРАЦИОННЫЙ #STATE
- #HELP "scsismrt.hlp"
- #HELPTAG 102
:: = 102

ДЛЯ ОДНОЙ ПЕРЕМЕННОЙ

ТИП ПРЕРЫВАНИЯ sCSISmart6
Циклон ПРЕДПРИЯТИЯ
ПЕРЕМЕННЫЕ {cycHostAdapterNumber}
ОПИСАНИЕ
"HostAdapter# %d Перестал работать"
- #TYPE "Хост-адаптер перестал работать"
- #SUMMARY "HostAdapter# %d Перестал работать"
- #ARGUMENTS {0}
- ОЧЕНЬ ВАЖНЫЙ #SEVERITY
- #TIMEINDEX 100
- ОПЕРАЦИОННЫЙ #STATE
- #HELP "scsismrt.hlp"
- #HELPTAG 110
:: = 110

-1
задан 17 June 2015 в 14:48

2 ответа

Возможно это может быть сделанный путь лучше. Однако это может быть сделано с помощью этих 3 команд:

desc="$(< inputfile awk '/DESCRIPTION/ {getline; sub(/^\s*"/, ""); sub(/"\s*$/, ""); print}')"
numvar="$(< inputfile awk '/VARIABLES/,/DESCRIPTION/ {count++}; END {if (count>0) print count-1; else print 0}')"
casenum="$(< inputfile awk '/::=/ {sub(/^\s*::=\s*/, ""); sub(/\s*$/, ""); print}')"
2
ответ дан 1 August 2019 в 10:11

Править:

Создайте файл, назовите его вообще, Вы любите и копируете awk рев сценария в него. chmod +x scriptname.awk сделать это исполняемым файлом.

#!/usr/bin/awk -f

BEGIN {var_num=0} 
/VARIABLES/,/}/ {
    sub("{","");
    sub("}","");
    sub("VARIABLES",""); 
    if ($0~/[[:alpha:]],/||/[[:alpha:]]/)var_num+=1
    }

 /DESCRIPTION/{ 
    getline; printf "%s,",$0
    } 
/::=/ {
    printf $2","
    }
END{ printf var_num }

Теперь вот мой пример запущения скрипта:

$ IFS=","; ARRAY=($(./three-lines.awk test-text.txt  | xargs echo ))                               
$ echo ${ARRAY[0]}; echo ${ARRAY[1]}; echo ${ARRAY[2]}                                             
SNMP Agent is up. 
101
5

Effectivelly, это создает массив 3 элементов, и те элементы - то, какие awk извлечения сценария формируют файл. Regex [[: альфа:]] используется для рассмотрения алфавитных scrings и алфавитных строк с комами, поскольку переменные, следовательно var_num увеличен; при отсутствии строк, которые соответствуют тому шаблону, var_num не увеличен ИСХОДНЫЙ

Вот моя awk острота:

awk 'BEGIN {var_num=0} /VARIABLES/,/}/ {sub("{","");sub("}","");sub("VARIABLES",""); var_num+=1} END{ print var_num}' test-text.txt

Основная идея: создайте переменную var_num, скажите awk читать все между строками, содержащими строку ПЕРЕМЕННЫХ и изогнутую фигурную скобку}. Избавьтесь от той строки, всех фигурных скобок, и у нас только есть строки, которые представляют переменные. Добавьте 1 для каждой строки к var_num. В конце - печатают общее количество считаемых переменных.

Причина удаления ПЕРЕМЕННЫХ и фигурных скобок, то, что мы не хотим считать строки, которые содержат только ПЕРЕМЕННУЮ СТРОКУ или изогнутую фигурную скобку. Таким образом, мы должны удостовериться, что их не стало.

Другой шаблон, который я заметил, - то, что каждая переменная разделяется от комы. Таким образом Вы могли использовать если оператор, что-то как if ($0~/,/) { var_num+=1 }

2
ответ дан 1 August 2019 в 10:11

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

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