Я должен скопировать "Агент 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
Возможно это может быть сделанный путь лучше. Однако это может быть сделано с помощью этих 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}')"
Править:
Создайте файл, назовите его вообще, Вы любите и копируете 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 }