我想要一个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
答案 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也可以很好地运行。