以下脚本:
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个),每个元素都包含日期和时间,由原始空间分隔。
如何修复我的脚本,同时保留数组初始化,to 9元素仅限于,以实现这一点?
发布于 2019-12-18 18:22:21
您可以使用mapfile -t并从进程替换中读取数据,就像@Kusalananda指出的那样。
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变量更改为换行符(默认值是空格字符、制表符和换行符),然后将其更改为原来的值。
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
发布于 2019-12-18 17:41:24
awk '{print NR-1 ": ", "start:", $1, $2;}' sample.log与来自问题的输入打印
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,如下所示
awk '{printf "%d: start: %s %s\n", NR-1, $1, $2;}' sample.log命令替换有一些空白或特殊字符的缺陷。显然,输入中的两个字段保存在单独的数组元素中。此脚本根据原始脚本组合它们。
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))]}"
donehttps://unix.stackexchange.com/questions/557936
复制相似问题