2014-01-23 2 views
0

Мне была предоставлена ​​задача получить длинный список IP-адресов из другого файла с IP-адресами. Я создал этот скрипт bash, но он работает не очень хорошо. После выполнения скрипта я проверяю файл с именем «found», ничего нет, и когда я проверяю файл с именем «notfound», существует около 60 IP-адресов. В обоих файлах должно быть в общей сложности 1500 IP-адресов. Есть два файла; 1. список ip-адресов для извлечения (findtheseips.txt), 2. список ip-адресов для извлечения (listips.txt). Кто-нибудь может помочь мне заставить его работать. Большое спасибо. Я запустить скрипт так: ./script findtheseips.txtСопоставление списка IP-адресов с другим файлом с IP-адресами

#!/bin/bash 

declare -a ARRAY 
exec 10<&0 
exec < $1 
let count=0 

while read LINE; do 
ARRAY[$count]=$LINE 
if egrep "$LINE" listips.txt; then 
    echo "$LINE" >> found 
    else 
    echo "$LINE" >> notfound 
fi 
done 
+0

Вам не хватает '' 'в строке' egrep'. Это просто ошибка копирования? – Barmar

+0

Да Barmar это ошибка копирования. Спасибо. –

+0

Нет действительно Barmar. Этот скрипт мне пришлось вводить так много IP-адресов вручную, но я думал, что должен быть способ просто прочитать список ip-адресов в bash и позволить скрипту выполнять эту работу. На самом деле у меня другой сценарий. Он работает хорошо, но мне приходилось вводить вручную каждый IP-адрес, и это долгое время. –

ответ

1

Там нет необходимости пытаться использовать exec или создать массив.

Вы можете read из первого аргумента сценария $1.

Не нужно использовать egrep, если вы не пытаетесь выполнить расширенное регулярное выражение.

#!/bin/bash 

while read LINE; do 
    if grep "$LINE" listips.txt; then 
     echo "$LINE" >> found 
    else 
     echo "$LINE" >> notfound 
    fi 
done < $1 

Речь идет обо всех решениях BASH.

#!/bin/bash 

while read l1; do 
    n=0 
    while read l2; do 
     if [[ $l1 == $l2 ]]; then 
      echo "$l1" >> found 
      ((n++)) 
     fi 
    done < ips2 
    if [ $n -eq 0 ]; then 
     echo "$l1" >> notfound 
    fi 
done < $1 
+1

Благодарим за помощь. Я попробую. Вероятно, я делаю это более сложным, чем то, что есть. Спасибо –

+2

Это может иметь ложные срабатывания. Он будет соответствовать подстрокам, а '.' В IP-адресах будет соответствовать чему-либо. Используйте 'grep -x -F', а не' egrep'. – Barmar

+2

Я использовал 'egrep' просто потому, что это то, что использовал OP. В любом случае, это не приведет к ложным срабатываниям. Я протестировал его и обновил сценарий, предложив использовать только 'grep'. –

Смежные вопросы