简单的 BASH - 如何逐行读取文件

Div*_*ivZ 2 command-line bash scripts text-processing

我有一个包含以下内容的文件:

6 192.168.0.4   
13 192.168.0.2        
2 192.168.0.9
Run Code Online (Sandbox Code Playgroud)

第一个数字是右侧 IP 尝试从同一网络内登录我的机器 (ssh) 的次数。目标是在尝试次数超过 3 次时使用 netfilter 阻止该 IP。这里,有 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
Run Code Online (Sandbox Code Playgroud)

这给出了指向第 5 行(if 语句)的“未找到命令”错误。难怪,因为我回应了 $char1_attempt 并且它给出了:

6 13 2
6 13 2
6 13 2
Run Code Online (Sandbox Code Playgroud)

目前,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
Run Code Online (Sandbox Code Playgroud)

请帮忙!

Byt*_*der 6

我建议这样开始:

#!/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"
Run Code Online (Sandbox Code Playgroud)

这样,read将每行的第一个字存储在 中,将行$num的其余部分存储在中$addr,这应该只是 IP 地址。然后在 while 循环中,我们检查两者是否都为空,如果是,则打印消息。