Linux 如何在zshell中的关键字处拆分字符串并保存结果?

Linux 如何在zshell中的关键字处拆分字符串并保存结果?,linux,shell,zsh,Linux,Shell,Zsh,我是zshell新手,尝试使用关键字作为分隔符拆分字符串。输出来自netfilter,并不总是在固定位置,因此我需要在我感兴趣的关键字处进行拆分 我找到了一种可行的方法,但似乎应该有一种更简单的方法。有什么想法吗 line="[Thu Jul 23 12:29:50 2015] IN=eth0 OUT= SRC=10.1.1.17 DST=10.101.11.1 PROTO=TCP SPT=46286 DPT=1113 SYN URGP=0 " # this returns a substr

我是zshell新手,尝试使用关键字作为分隔符拆分字符串。输出来自netfilter,并不总是在固定位置,因此我需要在我感兴趣的关键字处进行拆分

我找到了一种可行的方法,但似乎应该有一种更简单的方法。有什么想法吗

line="[Thu Jul 23 12:29:50 2015] IN=eth0 OUT= SRC=10.1.1.17 DST=10.101.11.1  PROTO=TCP SPT=46286 DPT=1113 SYN URGP=0 "

# this returns a substring starting from 'SRC=' to the end
tmp=${(MS)line##SRC=*}

# use the first element returned in the substring
src=$tmp[(w)1] 

echo "src is $src"

几乎可以将
转换为关联数组,但是
键=值
项似乎太不规则,因为有时
=
缺失,有时没有
。因此,一种方法是简单地将整个
在空间上拆分,并将其放入数组的元素中。目前还不清楚输出的顺序依赖性如何,但如果您可以指望所需的键存在并且顺序一致,那么一种方法是:

ary=( ${(s. .)line} )  # split on spaces, storing into array
print $ary[8]
SRC=10.1.1.17
现在您可以通过索引获取任何键值。也可以将此数组用作真正关联数组的起点

timestamp=${${line%%\]*}##*\[}
typeset -A info
for x in ${=line#*\]}; do
  if [[ $x = *=* ]]; then
    info[${x%%=*}]=${x#*=}
  else
    info[$x]=
  fi
done
echo src is $info[SRC]

您可能需要先删除日期戳(
[…]
)。

您几乎可以将
变成一个关联数组,但是
键=值
项似乎太不规则,因为有时
=
缺失,有时没有
。因此,一种方法是简单地将整个
在空间上拆分,并将其放入数组的元素中。目前还不清楚输出的顺序依赖性如何,但如果您可以指望所需的键存在并且顺序一致,那么一种方法是:

ary=( ${(s. .)line} )  # split on spaces, storing into array
print $ary[8]
SRC=10.1.1.17
现在您可以通过索引获取任何键值。也可以将此数组用作真正关联数组的起点

timestamp=${${line%%\]*}##*\[}
typeset -A info
for x in ${=line#*\]}; do
  if [[ $x = *=* ]]; then
    info[${x%%=*}]=${x#*=}
  else
    info[$x]=
  fi
done
echo src is $info[SRC]

您可能需要首先删除日期戳内容(
[…]
)。

要解析单个关键字,我将使用与
=~
匹配的正则表达式

要解析多个关键字,我将使用空格拆分字符串减去时间戳,并将输出存储在关联数组中

timestamp=${${line%%\]*}##*\[}
typeset -A info
for x in ${=line#*\]}; do
  if [[ $x = *=* ]]; then
    info[${x%%=*}]=${x#*=}
  else
    info[$x]=
  fi
done
echo src is $info[SRC]

要解析单个关键字,我将使用正则表达式匹配
=~

要解析多个关键字,我将使用空格拆分字符串减去时间戳,并将输出存储在关联数组中

timestamp=${${line%%\]*}##*\[}
typeset -A info
for x in ${=line#*\]}; do
  if [[ $x = *=* ]]; then
    info[${x%%=*}]=${x#*=}
  else
    info[$x]=
  fi
done
echo src is $info[SRC]