以下脚本:
DYN_HOSTS_START_ARRAY=($(grep -E "STARTING HOST" sample.log | cut -d' ' -f 1,2))
for ((i=0; i< ${#DYN_HOSTS_START_ARRAY[@]}; i++))
do
echo "$i: start: "${DYN_HOSTS_START_ARRAY[$i]}""
done
使用以下 sample.log 文件:
2019-11-11 19:05:55,823 DEBUG STARTING HOST 46
2019-11-11 19:05:55,831 DEBUG STARTING HOST 703
2019-11-11 19:05:55,837 DEBUG STARTING HOST 505
2019-11-11 19:05:55,858 DEBUG STARTING HOST 93
2019-11-11 19:05:55,859 DEBUG STARTING HOST 486
2019-11-11 19:05:55,861 DEBUG STARTING HOST 72
2019-11-11 19:05:55,879 DEBUG STARTING HOST 855
2019-11-11 19:05:55,913 DEBUG STARTING HOST 560
2019-11-11 19:05:56,067 DEBUG STARTING HOST 199
产生以下不需要的输出:
0: start: 2019-11-11
1: start: 19:05:55,823
2: start: 2019-11-11
3: start: 19:05:55,831
4: start: 2019-11-11
5: start: 19:05:55,837
6: start: 2019-11-11
7: start: 19:05:55,858
8: start: 2019-11-11
9: start: 19:05:55,859
10: start: 2019-11-11
11: start: 19:05:55,861
12: start: 2019-11-11
13: start: 19:05:55,879
14: start: 2019-11-11
15: start: 19:05:55,913
16: start: 2019-11-11
17: start: 19:05:56,067
所需的输出应该只有 9 个元素(而不是 18 个),每个元素都包含日期和时间,由原始空格分隔。
如何在保留数组初始化的同时将我的脚本修复为仅 9 个元素以完成此操作?
来自问题打印的输入
要更好地控制输出格式,您也可以
printf
像这样使用命令替换在空格或特殊字符方面存在一些缺陷。显然,输入中的两个字段保存在单独的数组元素中。该脚本根据您的原始脚本将它们组合在一起。
正如@Kusalananda指出的那样,您可以使用
mapfile -t
和读取来自进程替换的数据。或者您可以将
IFS
用于分词的变量更改为换行符(默认值为空格字符、制表符和换行符),然后将其更改回其原始值。输出(两种变体):
有关的: