复制文件的某些部分

复制文件的某些部分

我要复制“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 }

相关内容