我要复制“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 中取出
我需要的是找到DESCRIPTION并复制其后的文本。对于数字,我找到::=并复制其后的文本。对于变量,我找到VARIABLE并找到其后的变量数量。
因此假设这些变量
desc 是描述的变量
numvar 是变量的总数
casenum 是 ::= 后面的数字
所以当我打印上述变量时
描述变量的 输出
SNMP 代理已启动。
numvar 变量 的输出
5
casenum 变量 的输出
101
编辑
无变量
sCSISmart2 TRAP-TYPE
ENTERPRISE cyclone
描述
“SNMP 代理已关闭。”
--#TYPE “SNMP 代理已关闭。”
--#SUMMARY “SNMP 代理已关闭”
--#ARGUMENTS {}
--#SEVERITY INFORMATIONAL
--#TIMEINDEX 100
--#STATE OPERATIONAL
--#HELP “scsismrt.hlp”
--#HELPTAG 102
::= 102
对于一个变量
sCSISmart6 TRAP-TYPE
ENTERPRISE cyclone
变量 {cycHostAdapterNumber}
描述
“HostAdapter# %d 发生故障”
--#TYPE “主机适配器发生故障”
--#SUMMARY “HostAdapter# %d 发生故障”
--#ARGUMENTS {0}
--#SEVERITY CRITICAL
--#TIMEINDEX 100
--#STATE OPERATIONAL
--#HELP “scsismrt.hlp”
--#HELPTAG 110
::= 110
答案1
也许可以做得更好。但是可以使用以下 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
编辑:
创建一个文件,随意命名,然后将下面的 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
实际上,这会创建一个包含 3 个元素的数组,这些元素就是 awk 脚本从文件中提取的内容。正则表达式 [[:alpha:]] 用于将字母符号和带逗号的字母字符串视为变量,因此 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 读取包含 VARIABLES 字符串和花括号 } 的行之间的所有内容。删除该字符串和所有花括号,我们只剩下代表变量的字符串。将 的每一行加 1。var_num
最后 - 打印计数变量的总数。
删除变量和花括号的原因是我们不想计算包含以下内容的行仅有的VARIABLE 字符串或花括号。所以我们需要确保它们已经消失。
我注意到的另一个模式是每个变量都用逗号分隔。因此,您可以使用 if 语句,例如if ($0~/,/) { var_num+=1 }