将特定字符串添加到数组 sed/awk/grep

将特定字符串添加到数组 sed/awk/grep

我有这个

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 

相关内容