我有这个
ciscoFlashCopyStatus 对象类型 语法 整数 { 复制操作待处理(0), 复制进行中(1), 复制操作成功 (2), 复制无效操作 (3) 复制无效协议 (4) 复制无效源名称 (5) 复制无效目标名称 (6) 复制无效服务器地址 (7) 复制设备忙 (8) copyDeviceOpenError (9), 复制设备错误(10), 复制设备不可编程(11) copyDeviceFull (12), copyFileOpenError(13), 复制文件传输错误(14), 复制文件校验和错误(15), copyNoMemory (16), 复制未知失败(17), 复制无效签名(18) } MAX-ACCESS 只读 状态当前
我想做的事
一些命令将每个名称复制VARIABLE
到名为的数组中var
输出示例
回显“${var[0]} 复制操作待处理 echo "${var[1]} 复制正在进行 echo "${var[2]} 复制操作成功 等等..
有什么想法我可以如何实现这个目标吗?
笔记这有点像我之前问过的一个类似的问题,但是有些事情已经发生了变化,我不能再使用旧问题中提供的相同解决方案。
答案1
使用grep
:
mapfile -t var < <(grep -Po '^\s+\K[^ ]+(?= ?\(\d+\),?$)' file.txt)
grep -P
将使用 PCRE(Perl 兼容正则表达式)grep -o
将打印匹配的行部分^\s+\K
将匹配以空格开头的行,并\K
丢弃匹配[^ ]+
将符合我们期望的部分(?= *\(\d+\))
是零宽度正向预测模式,确保在我们期望的匹配之后,后面跟着零个或一个空格(
、一个或多个数字,最后是)
零个或一个,
mapfile
是shell内置的,用于创建数组。$ mapfile -t var < <(grep -Po '^\s+\K[^ ]+(?= ?\(\d+\),?$)' file.txt) $ echo "${var[0]}" copyOperationPending $ echo "${var[1]}" copyInProgress $ echo "${#var[@]}" 19
答案2
您可以只 grep 包含字段的行,并使用 sed 删除左括号后的所有内容。生成的单词列表可直接用于填充数组:
var=($(grep input-file ' *[a-zA-Z]\+ \?([0-9]\+)' | sed 's/(.*//'))
echo ${var[1]}
grep 中使用的正则表达式是:
- 空格 +
*
:任意数量的空格(包括 0) [a-zA-Z]\+
:任意数量的字母(至少 1 个)- 空格 +
\?
:可选空格 (
: 左括号[0-9]\+
:任意数量的数字(至少 1 位))
: 右括号
答案3
对于显示的特定文件,如果您只想要以 开头的字符串copy
,则只需执行以下操作即可:
var=( $(grep -o 'copy[^(]*' file) )
你有:
$ for((i=0;i<${#var[@]};i++)); do echo "${var[i]}"; done
copyOperationPending
copyInProgress
copyOperationSuccess
copyInvalidOperation
copyInvalidProtocol
copyInvalidSourceName
copyInvalidDestName
copyInvalidServerAddress
copyDeviceBusy
copyDeviceOpenError
copyDeviceError
copyDeviceNotProgrammable
copyDeviceFull
copyFileOpenError
copyFileTransferError
copyFileChecksumError
copyNoMemory
copyUnknownFailure
copyInvalidSignature
答案4
使用gawk
var=($(gawk '/{/,/}/ {if ($0 ~ /copy/) {match ($0, "[[:alpha:]]+", a); printf "%s\n",a[0]}}' <your_file>))
使用perl
var=($(perl -ne 'if (/copy/) {s/\s*([[:alpha:]]*).*/$1/g; printf "%s\n",$_}' <your_file>))
例子
awk
$ var=($(gawk '/{/,/}/ {if ($0 ~ /copy/) {match ($0, "[[:alpha:]]+", a); printf "%s\n",a[0]}}' foo))
$ for((i=0;i<${#var[@]};i++)); do echo "${var[i]}"; done
copyOperationPending
copyInProgress
copyOperationSuccess
copyInvalidOperation
copyInvalidProtocol
copyInvalidSourceName
copyInvalidDestName
copyInvalidServerAddress
copyDeviceBusy
copyDeviceOpenError
copyDeviceError
copyDeviceNotProgrammable
copyDeviceFull
copyFileOpenError
copyFileTransferError
copyFileChecksumError
copyNoMemory
copyUnknownFailure
copyInvalidSignature
perl
$ var=($(perl -ne 'if (/copy/) {s/\s*([[:alpha:]]*).*/$1/g; printf "%s\n",$_}' foo))
$ for((i=0;i<${#var[@]};i++)); do echo "${var[i]}"; done
copyOperationPending
copyInProgress
copyOperationSuccess
copyInvalidOperation
copyInvalidProtocol
copyInvalidSourceName
copyInvalidDestName
copyInvalidServerAddress
copyDeviceBusy
copyDeviceOpenError
copyDeviceError
copyDeviceNotProgrammable
copyDeviceFull
copyFileOpenError
copyFileTransferError
copyFileChecksumError
copyNoMemory
copyUnknownFailure
copyInvalidSignature
cat foo
ciscoFlashCopyStatus OBJECT-TYPE
SYNTAX INTEGER
{
copyOperationPending(0),
copyInProgress(1),
copyOperationSuccess (2),
copyInvalidOperation (3),
copyInvalidProtocol (4),
copyInvalidSourceName (5),
copyInvalidDestName (6),
copyInvalidServerAddress (7),
copyDeviceBusy (8),
copyDeviceOpenError (9),
copyDeviceError (10),
copyDeviceNotProgrammable (11),
copyDeviceFull (12),
copyFileOpenError (13),
copyFileTransferError(14),
copyFileChecksumError(15),
copyNoMemory (16),
copyUnknownFailure(17),
copyInvalidSignature(18)
}
MAX-ACCESS read-only
STATUS current