web-dev-qa-db-ja.com

Simple BASH-ファイルを1行ずつ読み込む方法

次のファイルがあります:

6 192.168.0.4   
13 192.168.0.2        
2 192.168.0.9

最初の数字は、右側のIPが同じネットワーク内から私のマシン(ssh)にログインしようとした回数です。目標は、試行が3回を超える場合、netfilterを使用してそのIPをブロックすることです。ここでは、2つのエントリが基準に一致します。注:3つ以上のエントリーがある場合があります。

このファイルを1行ごとに並べ替える方法がわかりません(私は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行目(ifステートメント)を指す「コマンドが見つかりません」エラーが発生します。当然、$ 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
DivZ

このように始めることをお勧めします:

#!/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アドレスのみである必要があります。次に、whileループ内で、両方が空でないかどうかを確認し、空でない場合はメッセージを出力します。

5
Byte Commander