Bash 使用FOR循环将列表中的项与数组中的项进行比较

Bash 使用FOR循环将列表中的项与数组中的项进行比较,bash,shell,file,scripting,Bash,Shell,File,Scripting,基本上,我是从用户提供的文件创建一个IP地址数组,没有太多的漏洞。然后我有另一个文件,有三列数据和多行,第一列是IP地址 我要做的是循环遍历包含3列数据的文件,并将IP地址与数组中的值进行比较,如果数组中的文件中存在值,则打印一些文本以及文件该行的第3列 我有一种感觉,我采取了一种非常错误的方法,使事情变得比他们需要的困难得多 下面是半伪代码 #!/bin/bash scopeFile=$1 data=$2 scopeArray=() while IFS= read -r line; d

基本上,我是从用户提供的文件创建一个IP地址数组,没有太多的漏洞。然后我有另一个文件,有三列数据和多行,第一列是IP地址

我要做的是循环遍历包含3列数据的文件,并将IP地址与数组中的值进行比较,如果数组中的文件中存在值,则打印一些文本以及文件该行的第3列

我有一种感觉,我采取了一种非常错误的方法,使事情变得比他们需要的困难得多

下面是半伪代码

#!/bin/bash 

scopeFile=$1 
data=$2

scopeArray=()
while IFS= read -r line; do
scopeArray+=("$line")
done <$1

for line in $2; do 
  if [[ $line == scopeArray ]]; then 

  awk '{print $3 " is in scope!"}' $2; 

  else 

    echo "$line is NOT in scope!" 

  fi;
done 
192.168.0.14
192.168.0.15
192.168.0.16
192.168.0.14:example.com
192.168.0.15:foobar.com
192.168.0.19:test.com

这里有一种方法可以满足您的需求

#/usr/bin/env bash
映射文件-t范围数组<“$1”
而read-r col1 col2 col3;做
对于“${!scopeArray[@]}”中的项;做
如果[[$col1==“${scopeArray[item]}”];然后
printf“%s”在范围内\n'$col3“
取消设置“scopeArray[项目]”&中断(&B)
其他的
printf“%s”不是作用域\n'$col1“>&2
fi
完成
完成<“$2”
  • shell即使不是比较文件的最佳工具,也不是最好的工具,但它将缓慢但肯定地帮助您实现这一目标

  • mapfile
    是一个bash4+特性jyfi


你为什么不在awk里做这些呢?这比这容易多了。@oguz.ismail我知道awk非常强大,但你认为它能做到我提到的一切吗?你有没有一个你会怎么做的例子?是的,我想是的。您需要回答您的问题才能添加示例输入和输出。我在以前的代码块中添加了一条注释,它位于代码块中,因为SO不喜欢我设置data.txt的格式。不过,您的解决方案看起来应该有效。我很快就要试一试。非常感谢。你的解决方案简直是一针见血!更改了一些样式位并删除了else部分,因为我没有预料到实际文件会有多少输出。不过非常感谢!:-)
scope.txt=$1 
data.txt=$2