Shell嵌套用于循环和字符串比较

时间:2015-03-26 21:16:39

标签: linux bash shell unix

我有两个文件 文件1

104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

和file2

103.27.24.114:99999999
103.27.24.114:88888888888
104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

并且在file2中有两个新行

103.27.24.114:99999999
103.27.24.114:88888888888

所以我想检查文件中是否有新行

for i in $(cat $2)
    do
        for j in $(cat $1)
        do
            if [ $i = $j ]; then
                echo $i
            fi
        done
    done

/.program file1 file2

但我没有得到预期的输出。我认为我的if语句不能正常工作。我做错了什么?

3 个答案:

答案 0 :(得分:3)

您的问题可能是您在file1中为每个行中的每行循环。

comm实用程序可以执行您想要的操作,但它会假定这两个文件都已排序。

$ sort file1 -o file1
$ sort file2 -o file2
$ comm -13 file1 file2
103.27.24.114:99999999
103.27.24.114:88888888888

答案 1 :(得分:1)

这是diff的用途。例如:

$ diff dat/newdat1.txt dat/newdat2.txt
0a1,2
> 103.27.24.114:99999999
> 103.27.24.114:88888888888

newdat1.txtnewdat2.txt的位置:

104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

103.27.24.114:99999999
103.27.24.114:88888888888
104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

根据选项和需求,您可以根据输出或不输出来测试diff的返回值。 (例如if diff -q $file1 $file2 >/dev/null; then echo same; else echo differ; fi

答案 2 :(得分:0)

#!/bin/bash
for n in $(diff file1 file2); do 
   if [ -z "$firstLineDiscarded" ]; then
       firstLineDiscarded=TRUE
   elif [ $n != ">" ]; then 
      echo $n
  fi
done

如果您不依赖于这种特定的方法,这似乎有效。

当然,如果输入语法发生变化(包括数据中的空格),它就会崩溃,但对于这个严格的应用程序......可能已经足够了。