我正在尝试编写一个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
答案 0 :(得分:3)
正如评论中指出的
if [[
缺少其结束语]]
。[
不是文字,而是开始一个字符组。要匹配[1234 s]
之类的内容,您必须编写\[[0-9]* s\]
。要从1234
中仅提取数字\[1234 s\]
,可以使用tr
,sed
,perl -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'