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)
请帮忙!
我建议这样开始:
#!/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 循环中,我们检查两者是否都为空,如果是,则打印消息。
| 归档时间: |
|
| 查看次数: |
5957 次 |
| 最近记录: |