@habrcomskylifelv

Сравнить файлы и удалить совпадения по первым 7 символам?

Привет.
подскажите как из файла, после отработки сортировки (итог ниже) удалить строки которые совпадают с содержимым файла ниже этого лога?

вывод с лога
167.172.96.61
167.99.184.41
170.64.153.132
170.64.154.53
170.64.177.42
172.104.11.4
172.105.128.13
177.101.246.158
178.128.151.41
178.128.163.60
178.128.84.112
178.62.73.12
188.166.68.252
190.56.162.181
192.155.90.118
198.235.24.198
206.189.196.2
285.0.0.13
3.20.205.156
34.224.165.10
34.74.185.230
35.216.229.26
35.227.106.140
35.247.252.65
43.230.192.1
45.79.172.21
45.79.181.104
46.101.103.192
51.68.176.4
68.183.13.153
68.183.181.189
78.31.92.37
94.228.169.107
95.68.67.215

теперь надо сравнить с этим файлом
80.233.188.0/22
91.204.64.0/22
94.103.48.0/20
94.100.10.0/24
91.216.2.0/24
85.254.157.0/24
195.130.205.0/24
185.31.44.0/22
195.216.236.0/24
194.152.32.0/23
62.122.16.0/21
194.213.100.0/23
185.113.168.0/24
81.94.238.0/24
93.191.171.0/24
185.113.170.0/24
185.113.168.0/23
193.169.194.0/23
91.213.106.0/24
193.169.166.0/23
193.105.155.0/24
185.27.92.0/22
109.205.120.0/21
94.100.0.0/20
94.100.3.0/24
193.105.166.0/24
92.63.94.0/23

Спасибо !
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 3
trapwalker
@trapwalker
Программист, энтузиаст
Вообще такая себе идея проверять принадлежность адреса подсети с помощью строковых операций. Мне кажется лучше вместо баша заюзать питоновский скрипт и сделать все правильно. ВОт такие функции могут пригодиться:
def mask(bitcount):
    return 2**bitcount-1 << (32-bitcount)

def ip2int(ip):
    return sum(256**i*int(octet) for i, octet in enumerate(reversed(ip.split('.'))))

def addr_in_network(addr, network):
    net, mask_size = network.split('/')
    mask_value = mask(int(mask_size))
    return ip2int(addr) & mask_value == ip2int(net) & mask_value
Ответ написан
Комментировать
1. крутим циклfor
2. обрезаем 7 символов в условиме поиска через head -c7 ну или через cat 11.txt |egrep -o .{7}
там как придумаешь
3 ищем в массиве grep -v (отрицание шаблона) и выводим его на вывод если true
Все

А вот тебе пример с чего можно начать работать
Обработка содержимого файла

Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd:

#!/bin/bash
IFS=$'\n'
for entry in $(cat /etc/passwd)
do
echo "Values in $entry –"
IFS=:
for value in $entry
do
echo " $value"
done
done

Ответ написан
3vi1_0n3
@3vi1_0n3
На баше как-то так (минимум внешних команд, от cat можно избавиться, если использовать exec):
#!/bin/bash

octets=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

addrtobin(){
    for digit in ${1//./ }; do echo -n ${octets[digit]}; done
}

# Просто пример для списков адресов и сетей.
# Лучше используйте exec N<>filename.txt + read -u N
ips=$(cat ips.txt)
nets=$(cat nets.txt)

for ip in $ips
do
    out=1
    bin_ip=$(addrtobin $ip)
    for net in $nets
    do
        bin_net=$(addrtobin ${net%%/*})
        net_mask=${net#*/}
        if [ "${bin_ip:1:$net_mask}" == "${bin_net:1:$net_mask}" ]
        then
            out=0
            break # Чтобы не проходить до конца списка сетей, если адрес уже найден
        fi
    done
    [ $out -eq 1 ] && echo $ip
done


К сожалению, придется делать двойной цикл. К счастью, можно не прогонять внутренний цикл до конца, если совпадение найдено, поэтому будет самую малость быстрее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы