Bash脚本比较两个文件的匹配

时间:2014-06-29 03:51:45

标签: bash

我想要一个bash脚本,它将接收File1中的Item 1,遍历File2中的所有行,如果存在匹配则输出。递归地继续模式,Item2,File1遍历File2中的所有行以进行匹配,继续此模式,直到文件1中的所有行都已处理完毕。

现在,检查一下,示例数据。

File1 - 主机名的单列,使用短名称

vsie1p990
vsie1p991
vsie1p992
...

File2 - 多列,逗号分隔,第一列是主机名(短名称)

格式:短名称,IP地址,fqdn

vsie1p992,191.167.44.212,vsie1p992.srv.us.company.com

我尝试了以下内容,但有些事情并不完全正确:

#!/bin/bash
echo "Report Generated"
date

count=0

while read list ; do
{
  IT=`grep -i "$list" $2`
  If [ -n "$IT" ] ; then
     echo "Match Found: $list"
     count=`expr "$count" + 1`
  fi
 }
 done <$1
 echo "Total Matches = $count"

示例运行:&gt; ./checkit.sh list1 list2

非常感谢任何帮助,建议和指导。

-Richard

3 个答案:

答案 0 :(得分:2)

您可以将File1传递给grep作为模式列表:

grep -i -f File1 File2 > result
echo -n "Total matches: "; wc --lines result | cut -d' ' -f1

答案 1 :(得分:0)

从效率的角度来看,最好将所有file_1搜索值读入bash中的数组,然后使用grep测试file2是否存在file_2中的代码。这是一个例子:

#!/bin/bash

# validation checks omitted

declare -a codes

code=( `<"$1"` )   # read file1 values into array
szcode=${#code[@]}    # get the number of values read

for ((i=0; i<$szcode; i++)); do

    if `grep -q "${code[$i]}" "$2" &>/dev/null`; then
        echo " [checking $i of $szcode codes] - ${code[$i]} found in $2"
    fi

done

exit 0

输出:

[checking 1 of 3 codes] - vsie1p991 found in readtitle.sh

这也为您从grep获取的信息提供了极大的灵活性。例如,它可以返回匹配的行号等。

答案 2 :(得分:-1)

我知道您要求使用Bash解决方案,但这个Python代码应该更快。对于第一个文件中的每一行,不是在整个第二个文件上运行一次grep,而是读取第一个文件,然后在一次传递中匹配第二个文件中的行。

import sys

if len(sys.argv) != 3:
    print("Usage: match_fnames <file_with_names> <log_file>")
    sys.exit(1)

file_with_names, log_file = sys.argv[1:]

with open(file_with_names, "rt") as f:
    set_of_names = set(line.strip() for line in f)

total_matches = 0
with open(log_file, "rt") as f:
    for line in f:
        fields = line.split(',')
        hostname = fields[0]
        if hostname in set_of_names:
            total_matches += 1
            sys.stdout.write(line)

print("Total matches: {}".format(total_matches))

将它放在一个名为match_files.py的文件中,然后运行它:`python match_files.py filenames.txt logfile.txt&#34;

使用Python 3.x也可以很好地运行。