Bash将正则表达式值添加到数组

时间:2018-11-13 21:51:20

标签: regex bash shell

我正在尝试编写一个bash脚本,该脚本将接收一个文件并查找与正则表达式匹配的所有值,然后将其添加到数组中。

第一步,我编写了一个脚本,将日志文件中的所有行添加到数组中,并回显它们。然后,我尝试编辑该脚本以在日志文件中搜索正则表达式,这是我收到大量错误的地方。

我想做的是获取日志文件方括号内的值。日志文件中的某些行包含类似[23423234 s]的语法,这是一个时间戳。我想获取括号(而不是括号!)中的值(数字,空格和“ s”),然后将这些值添加到数组中。

我的初始脚本如下:

#!/bin/bash

echo "STARTING SCRIPT"

getArray(){
        array=()
        while IFS= read -r line
        do
                array+=("$line")
        done <"$1"
}

getArray "testlog.txt"
for e in "${array[@]}"
do
        echo "$e"
done

echo "DONE SCRIPT"

我正在查看的日志如下:

[1542053213 s] Starting Program:
-----------------------------------------
[1542053213 s] PROGRAM ERROR
ERRHAND: 1033
ERRHAND: 233545
ERRHAND: 1
[1542053213 s] Program completed!

[1542053213 s] Config File complete. Stopping!

我打算做的事情是使用以下伪代码进行操作:

For each line in file{
regex = [\d\ws]


    if line matches regex{
        add to array
    }
}

for each item in array{
    echo item
}

当前,我已将脚本编辑为如下所示:

#!/bin/bash

echo "STARTING SCRIPT"

getArray(){
    array=()
    while IFS= read -r line
    do
        if [[$line =~ [\d\ws]; then
        array+=("$line");
        fi
    done <"$1"  
}

getArray "log.txt"
for e in "${array[@]}"
do
    echo "$e"
done

echo "DONE SCRIPT"

但是,每当我运行它时,都会出现以下错误集:

[jm@local Home]$ ./Parser.sh 
STARTING SCRIPT
./Parser.sh: line 9: [[[1542053213: command not found
./Parser.sh: line 9: [[-----------------------------------------: command not found
./Parser.sh: line 9: [[[1542053213: command not found
./Parser.sh: line 9: [[ERRHAND:: command not found
./Parser.sh: line 9: [[ERRHAND:: command not found
./Parser.sh: line 9: [[ERRHAND:: command not found
./Parser.sh: line 9: [[[1542053213: command not found
./Parser.sh: line 9: [[: command not found
./Parser.sh: line 9: [[[1542053213: command not found
DONE SCRIPT

任何建议将不胜感激。我尝试查看其他文章,但没有一个能够真正解决我的问题,即为[2342323 s]模式创建适当的正则表达式,然后将其添加到数组中。 TiA

1 个答案:

答案 0 :(得分:3)

正如评论中指出的

  • if [[缺少其结束语]]
  • 在正则表达式中[不是文字,而是开始一个字符组。要匹配[1234 s]之类的内容,您必须编写\[[0-9]* s\]

要从1234中仅提取数字\[1234 s\],可以使用trsedperl -P或第二个grep -o

总体而言,您的脚本似乎过于复杂。您可以大大简化它。将for循环替换为mapfile,然后使用grep -o提取匹配项。您可以将整个脚本替换为此

mapfile -t array < <(grep -o '\[[0-9]* s\]' logfile | tr -d '[] s')
printf '%s\n' "${array[@]}"

请注意,如果只想打印匹配项,则不需要数组。仅grep部分就足够了:

grep -o '\[[0-9]* s\]' logfile | tr -d '[] s'