执行递归搜索并创建具有匹配模式的文件列表

时间:2017-03-06 15:47:05

标签: linux bash grep

我有一个名为dictionary.txt的词典文件。

它包含以下示例IP地址:

1.1.1.1
2.2.2.2
3.3.3.3

此目录中有许多IP_files.iplists,每个IP LIST包含许多不同的IP地址

我想搜索:1.1.1.1并且如果在其中一个IP LISTS中找到此字符串,则将所有找到的IP LIST文件名(例如IP_files_list1.iplists)输出到另一个以其命名的文件字典搜索词(例如1.1.1.1.txt

理想情况下,1.1.1.1.txt包含找到的所有文件名列表,2.2.2.2.txt将包含找到的所有IP LIST文件名列表。

grep -r "1.1.1.1" > 1.1.1.1

就我而言。这将创建一个名为1.1.1.1的文件,并列出" 1.1.1.1"的所有IPLISTS.iplists文件名。发现于。

所以1.1.1.1看起来像这样:

IP_files_list1.iplists
IP_files_list2.iplists
IP_files_list_another_list.iplists

2 个答案:

答案 0 :(得分:3)

使用read来阅读dictionary.txt

#!/bin/bash
cd /path/to/iplists
while IFS= read -r ip; do
  # get the list of files that contain this ip and save it in a file
  grep -Frlw "$ip" * > "$ip".txt
done < /path/to/dictionary.txt
  • -F$ip视为字符串,而非模式
  • -r选项,用于递归搜索/ path / to / plists下的所有文件
  • -l只是获取包含匹配项的文件名,而不是匹配的内容
  • -w查找整个ip(以​​便1.1.1.1不匹配11.1.1.1

答案 1 :(得分:-1)

像这样的衬里可以工作

ip='1\.1\.1\.1'; for f in $(find . -type f); do if cat $f | grep -q "$ip"; then echo $f; fi ; done >> $ip.txt

你也可以用另一个循环包围它:

for ip in '1.1.1.1' '2.2.2.2'; do for f in $(find . -type f); do if cat $f | grep -q "$ip"; then echo $f; fi ; done >> $ip.txt; done

或使用你的dictionary.txt

for ip in $(cat dictionary.txt); do for f in $(find . -type f); do if cat $f | grep -q "$ip"; then echo $f; fi ; done >> $ip.txt; done