Простой Bash - как считать файл линию за линией

У меня есть файл, который имеет следующее:

6 192.168.0.4   
13 192.168.0.2        
2 192.168.0.9

Первое число является количеством раз, в которое IP справа попытался войти в мою машину (ssh) из той же сети. Цель состоит в том, чтобы заблокировать тот IP с помощью netfilter, если попытка - больше чем 3. Здесь, 2 из записей соответствуют критериям.Примечание: Могло бы быть больше чем 3 записи.

Я не могу выяснить способ отсортировать этот файл линию за линией (я ОЧЕНЬ плохо знаком с Bash). Вот то, что я попробовал:

#!/bin/bash
file="/home/foo/documents/iptxt"
while IFS='' read line || [[ -n "$line" ]]; do
  char1=`awk '{ print $1 }' $file`
  char2=`awk '{ print $2 }' $file`
  if $char1 -gt 3
  then
    echo "$char2 has tried to login $char1 times
  fi
done <$file

Это дает "команду, не найденную" ошибка, указывающая на 5-ю строку (если оператор). Неудивительный, потому что я повторил $char1_attempt и он дает:

6 13 2
6 13 2
6 13 2

В настоящее время J просто хочу, чтобы это распечатало строки как:

192.168.0.4 has tried to login 6 times
192.168.0.2 has tried to login 13 times
192.168.0.1 has tried to login 2 times

Помогите!

1
задан 1 March 2018 в 02:46

1 ответ

Я рекомендовал бы запуститься как это:

#!/bin/bash
file="/home/foo/documents/iptxt"

while read num addr ; do 
    if [[ "$num" && "$addr" ]] ; then 
        echo "$addr has tried to log in $num times" 
    fi
done < "$file"

Сюда, read хранит первое слово каждой строки в $num и остальная часть строки в $addr, который должен только быть IP-адресом. Затем в цикле с условием продолжения, мы проверяем, не ли и пусты, и если это так, печатают сообщение.

5
ответ дан 3 December 2019 в 06:37

Другие вопросы по тегам:

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