BASH - 在多个文件中查找重复项

时间:2016-11-11 00:29:59

标签: bash awk grep uniq

我在同一目录中有多个文件,每个文件代表一个用户,并包含用于登录此帐户的IP,每个文件都在一个新行中。

我想创建一个脚本,检查多个文件中是否出现相同的IP,当然还有打印副本。

我尝试过使用awk,但没有运气,任何帮助都表示赞赏!

4 个答案:

答案 0 :(得分:1)

假设同一个文件上没有重复的IP地址,这应该适用于许多Bash版本中的IPv4地址:

#!/bin/bash
#For IP addresses v4, assuming no repeated IP addresses on the same file; result is stored on the file /tmp/repeated-ips
mkdir -p /tmp
grep -rhEo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /home/user/folder > /tmp/ipaddresses-holder
sort /tmp/ipaddresses-holder | uniq -d > /tmp/repeated-ips
Exit 0

下面的脚本稍微复杂一些,但无论单个文件上是否有重复的IP地址,它都会起作用:

#!/bin/bash
#For IP addresses v4, result is stored on the file /tmp/repeated-ips
mkdir -p /tmp
grep -rEo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /home/user/folder > /tmp/ipaddresses-holder
sort -u /tmp/ipaddresses-holder  > /tmp/ipaddresses-holder2
grep -rhEo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /tmp/ipaddresses-holder2 > /tmp/ipaddresses-holder3
sort /tmp/ipaddresses-holder3 | uniq -d > /tmp/repeated-ips
Exit 0

在这两种情况下,结果都存储在文件/ tmp / repeated-ips

答案 1 :(得分:0)

使用以下awk命令:

awk '$0 in a {print FILENAME, "IP:", $0, "also in:", a[$0]; next} {a[$0] = FILENAME}' /tmp/user*

假设你有像这样的IP文件

[tmp]$cat /tmp/user1
1.1.1.1
[tmp]$cat /tmp/user2
2.2.2.2
[tmp]$cat /tmp/user3
1.1.1.1

<强>输出

[tmp]$awk '$0 in a {print FILENAME, "IP:", $0, "also in:", a[$0]; next} {a[$0] = FILENAME}' /tmp/user*
/tmp/user3 IP: 1.1.1.1 also in: /tmp/user1

<强>解释

awk '
  $0 in a {                        # if IP already exists in array a
    print FILENAME, "IP:", $0, \   # print the output
       "also in:", a[$0];
    next;                          # get the next record without further
  }                                # processing
  {a[$0] = FILENAME}               # if reached here, then we are seeing IP
'                                  # for the first time, so store it

答案 2 :(得分:0)

我不确定我是否正确理解了您的问题,所以我想您想做什么:

你有几个文件。每个文件引用一个特定用户,并记录该用户用于登录的每个IP地址。例如:

$ cat alice.txt
192.168.1.1
192.168.1.5
192.168.1.1
192.168.1.1
$ cat bob.txt
192.168.0.1
192.168.1.3
192.168.1.2
192.168.1.3
$ cat eve.txt
192.168.1.7
192.168.1.5
192.168.1.7
192.168.0.7

您想知道多个文件中是否显示相同的IP地址。

这是我想出的。

#!/usr/bin/env bash
SEARCH_TERMS="search_terms.txt"
for source_file in $@
do
    for search_term in $(sort -u $source_file)
    do
        found=$(grep -F "${search_term}" $@ --exclude=${source_file})
        if [[ -n "${found}" ]]; then
            echo "Found ${search_term} from ${source_file} also here:"
            echo ${found}
        fi
    done
done

这可能不是最佳解决方案。

答案 3 :(得分:0)

如下:

class MyApp : App() {
    override val primaryView = LoginScreen::class
}

换句话说,连接和排序的所有文件之间的差异,以及连接,排序和删除重复项的所有文件之间的差异。