尝试在bash和grep中读取文件以获取子字符串,然后将该子字符串存储在数组中

时间:2018-07-26 16:06:33

标签: bash

我有一个名为test.txt的文件,其中包含一些数据,如下所示:

*************************** 19. row ***************************
       created_at: 2018-07-02 19:57:58
       deleted_at: 2018-07-03 14:17:05
       serial_num: 1269043217201
*************************** 20. row ***************************
       created_at: 2018-07-02 19:57:58
       deleted_at: 2018-07-03 14:17:05
       serial_num: 1269043217202

我需要将所有序列号存储在一个数组中。我已经尝试了一些基本的打印方法:

filename="test.txt"
c=0
while read -r line
    do
       echo $line | grep serial_num | sed -n -e 's/serial_num: //p'
    done < "$filename"

这将打印出看起来不错的数据:

1280521737734
1280521737735
1280521737736

但是当我添加

sn=(echo $line | grep serial_num | sed -n -e 's/serial_num: //p')
echo $sn

这也开始打印空白行。我该如何避免呢? 还要这样做

servs[$c] = $sn
c=$(expr $c + 1)

返回

./test.sh: line 138: servs[0]: command not found
./test.sh: line 138: servs[1]: command not found
./test.sh: line 138: servs[2]: command not found

1 个答案:

答案 0 :(得分:0)

假设bash 4.0或更高版本:

readarray -t sn < <(awk '/serial_num:/ { print $2 }' <"$filename")
declare -p sn # print array content

使用旧版本:

sn=( )
while read -r line; do sn+=( "$line" ); done < <(awk '/serial_num:/ { print $2 }' <"$filename")
declare -p sn # print array content

使用较旧的发行版,并且使用纯/本地bash:

sn=( )
while IFS=$' \t\n' read -r key val; do
  [[ $key = serial_num: ]] && sn+=( "$val" )
done <"$filename"
declare -p sn