我有一个名为的数组arrayvar
,其定义为
arrayvar=( $(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");print}' temp1 | tr -d '\n' | sed 's/^[ \t]*//' | sed 's/[ \t]*$//') )
和
vovar=VARIABLES
我的临时文件有一些变量,我使用上面的命令和tr
sed
删除空格的命令来获取它们。临时
文件
企业 eMylexRaid 事件信息 变量 { a9事件代码, a9控制器编号, a9频道号, a9目标号码, a9Lun编号, a9事件时间戳 } 描述 “设备已在线。” --#SUMMARY“[事件 %d ctl %d chn %d tgt %d lun %d 时间 %d:] 设备上线。” --#参数{0,1,2,3,4,5} --#严重性信息 --#TIMEINDEX 5 --# 状态运行 ::= 1
当我运行此命令时,只会arrayvar[0]
剥离其值,如下所示:
回显“${arrayvar[0]}” a9事件代码 回显“${arrayvar[1]}” a9控制器编号 回显“${arrayvar[2]}” a9频道号 回显“${arrayvar[3]}” a9目标号码
任何帮助都将不胜感激。谢谢!
答案1
你可以使用这个:
var=( $(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}') )
- 打印匹配记录
VARIABLES {
和匹配记录之间的每条记录}
,删除每个and
,
字符
但是我宁愿使用mapfile
单叉代替双叉来将值存储到数组中:
mapfile var < <(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}')
答案2
使用具有选项的更高版本的 GNU grep
(Ubuntu 自带)-z
:
$ IFS=, arrayvar=( $(grep -Pzo '\s+VARIABLES\s+{\K[^}]+(?=})' temp1 | tr -d '[:space:]') )
$ echo "${arrayvar[0]}"
a9EventCode
$ echo "${arrayvar[1]}"
a9ControllerNumber
$ echo "${#arrayvar[@]}"
6
-z
选项使得grep
输入文本的行由 ASCII NUL 分隔而不是换行符分隔,这样我们就可以逐字匹配换行符。PCRE 模式
\s+VARIABLES\s+{\K[^}]+(?=})
将匹配内部的文本{}
然后我们删除了空格(空格,制表符,换行符)
tr -d '[:space:]'
由于
IFS
设置为,,
我们可以创建用逗号分隔的字符串数组。
答案3
使用 awk 进行以下操作:
arrayvar=($(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");all=all$0} END {print all}' temp1 ))
答案4
使用perl
perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' <your_input_file>
解释
exit if ($start == 1 && /}/ );
}
如果遇到ifVARIABLES
(vovar
) 则退出脚本if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}
VARIABLES
如果(vovar
) 被通过,则打印该行$start=1 if (/'"$vovar"'/)
如果传递了
VARIABLES
( ) ,则设置开始标记vovar
例子
$ vovar=VARIABLES
$ arrayvar=($(perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' foo))
$ for((i=0;i<${#arrayvar[@]};i++)); do echo "${arrayvar[i]}"; done
a9EventCode
a9ControllerNumber
a9ChannelNumber
a9TargetNumber
a9LunNumber
a9EventTimeStamp
$ cat foo
ENTERPRISE eMylexRaidEventInformation
VARIABLES {
a9EventCode,
a9ControllerNumber,
a9ChannelNumber,
a9TargetNumber,
a9LunNumber,
a9EventTimeStamp
}
DESCRIPTION
"device became online."
--#SUMMARY "[Event %d ctl %d chn %d tgt %d lun %d Time %d :] device became online."
--#ARGUMENTS {0,1,2,3,4,5}
--#SEVERITY INFORMATIONAL
--#TIMEINDEX 5
--#STATE OPERATIONAL
::= 1