首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从命令输出中使用带空格的元素初始化数组

如何从命令输出中使用带空格的元素初始化数组
EN

Unix & Linux用户
提问于 2019-12-18 17:31:13
回答 2查看 180关注 0票数 0

以下脚本:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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

产生以下不需要的输出:

代码语言:javascript
复制
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个),每个元素都包含日期和时间,由原始空间分隔。

如何修复我的脚本,同时保留数组初始化,to 9元素仅限于,以实现这一点?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-12-18 18:22:21

您可以使用mapfile -t并从进程替换中读取数据,就像@Kusalananda指出的那样。

代码语言:javascript
复制
mapfile -t dyn_hosts_start_array < <(grep 'STARTING HOST' sample.log | cut -d' ' -f 1,2)    
for i in "${!dyn_hosts_start_array[@]}"; do
  printf '%s:  start: %s\n' "$i" "${dyn_hosts_start_array[i]}"
done

或者您可以将用于分词的IFS变量更改为换行符(默认值是空格字符、制表符和换行符),然后将其更改为原来的值。

代码语言:javascript
复制
oldifs=$IFS
IFS=产出(两种变体):0:  start: 2019-11-11 19:05:55,823
1:  start: 2019-11-11 19:05:55,831
2:  start: 2019-11-11 19:05:55,837
3:  start: 2019-11-11 19:05:55,858
4:  start: 2019-11-11 19:05:55,859
5:  start: 2019-11-11 19:05:55,861
6:  start: 2019-11-11 19:05:55,879
7:  start: 2019-11-11 19:05:55,913
8:  start: 2019-11-11 19:05:56,067相关信息:在bash脚本中,IFS=$‘n’的含义是什么?\n'
dyn_hosts_start_array=( $(grep 'STARTING HOST' sample.log | cut -d' ' -f 1,2) )
IFS=$oldifs    
for i in "${!dyn_hosts_start_array[@]}"; do
  printf '%s:  start: %s\n' "$i" "${dyn_hosts_start_array[i]}"
done

产出(两种变体):

A5

相关信息:

F16H17

C8

H29F210

票数 1
EN

Unix & Linux用户

发布于 2019-12-18 17:41:24

代码语言:javascript
复制
awk '{print NR-1 ": ", "start:", $1, $2;}' sample.log

与来自问题的输入打印

代码语言:javascript
复制
0:  start: 2019-11-11 19:05:55,823
1:  start: 2019-11-11 19:05:55,831
2:  start: 2019-11-11 19:05:55,837
3:  start: 2019-11-11 19:05:55,858
4:  start: 2019-11-11 19:05:55,859
5:  start: 2019-11-11 19:05:55,861
6:  start: 2019-11-11 19:05:55,879
7:  start: 2019-11-11 19:05:55,913
8:  start: 2019-11-11 19:05:56,067

要对输出格式有更多的控制,还可以使用printf,如下所示

代码语言:javascript
复制
awk '{printf "%d:  start: %s %s\n", NR-1, $1, $2;}' sample.log

命令替换有一些空白或特殊字符的缺陷。显然,输入中的两个字段保存在单独的数组元素中。此脚本根据原始脚本组合它们。

代码语言:javascript
复制
DYN_HOSTS_START_ARRAY=($(grep -E "STARTING HOST" sample.log | cut -d' ' -f 1,2))
for ((i=0; i< ((${#DYN_HOSTS_START_ARRAY[@]} / 2)); i++))
do
    echo "$i:  start: ${DYN_HOSTS_START_ARRAY[((2 * $i))]} ${DYN_HOSTS_START_ARRAY[((2 * $i + 1))]}"
done
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/557936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档