Arrays 从字符串数组中拾取有效IP

Arrays 从字符串数组中拾取有效IP,arrays,bash,ip-address,Arrays,Bash,Ip Address,在我的用例中,我将从列表中筛选某些IPV4,并将它们放入阵列中以执行进一步的任务: readarray -t firstarray < <(grep -ni '^ser*' IPbook.file | cut -f 2 -d "-") 正如您看到的,最后一行不是IP,因此我迫切需要在FIRSTARRAY上添加一些正则表达式检查。 我不想保存辅助文件来处理它们,所以我正在寻找一些“动态”选项来对firstarray进行正则化。我尝试了以下方法: for X in "${FIRSTAR

在我的用例中,我将从列表中筛选某些IPV4,并将它们放入阵列中以执行进一步的任务:

readarray -t firstarray < <(grep -ni '^ser*' IPbook.file | cut -f 2 -d "-")
正如您看到的,最后一行不是IP,因此我迫切需要在FIRSTARRAY上添加一些正则表达式检查。 我不想保存辅助文件来处理它们,所以我正在寻找一些“动态”选项来对firstarray进行正则化。我尝试了以下方法:

for X in "${FIRSTARRAY[@]}"; do
  readarray -t SECONDARRAY < <(grep -E '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b' "$X")
done

我做错了什么?最好的方法是什么?

您将
“$X”
作为参数传递给
grep
,因此它被视为一个文件。使用herestring
问题是,您将一个参数传递给
grep
命令,它希望读取标准输入

您可以在第一个命令中使用正则表达式筛选IP地址:

readarray -t firstarray < <(grep -ni '^ser*' IPbook.file | cut -f 2 -d "-" | grep -E '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b' )

readarray-t firstarray<为什么不将
grep-E'\b..
表达式应用于用于首先构建阵列的命令?我可以,但我仍必须将IP过滤到另一个阵列中。
line ABC: 172.0.20.30: No such file or directory
line ABC: 678.0.0.10: No such file or directory
for X in "${firstarray[@]}"; do
  readarray -t secondarray < <(grep -E '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b' <<< "$X")
done
#!/bin/bash
validate_ip() {
  local arr element
  IFS=. read -r -a arr <<< "$1"                  # convert ip string to array
  [[ ${#arr[@]} != 4 ]] && return 1              # doesn't have four parts
  for element in "${arr[@]}"; do
    [[ $element =~ ^[0-9]+$ ]]       || return 1 # non numeric characters found
    [[ $element =~ ^0[1-9]+$ ]]      || return 1 # 0 not allowed in leading position if followed by other digits, to prevent it from being interpreted as on octal number
    ((element < 0 || element > 255)) && return 1 # number out of range
  done
  return 0
}
for x in "${firstarray[@]}"; do
  validate_ip "$x" && secondarray+=("$x") # add to second array if element is a valid IP
done
readarray -t firstarray < <(grep -ni '^ser*' IPbook.file | cut -f 2 -d "-" | grep -E '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b' )