BASH đơn giản - cách đọc từng dòng tệp


1

Tôi có một tập tin như sau:

6 192.168.0.4   
13 192.168.0.2        
2 192.168.0.9

Số đầu tiên là số lần IP bên phải đã cố đăng nhập vào máy của tôi (ssh) từ trong cùng một mạng. Mục tiêu là chặn IP đó bằng cách sử dụng bộ lọc mạng nếu nỗ lực lớn hơn 3. Ở đây, 2 trong số các mục phù hợp với tiêu chí. Lưu ý: Có thể có nhiều hơn 3 mục.

Tôi không thể tìm ra cách sắp xếp từng dòng tệp này (Tôi RẤT mới với BASH). Đây là những gì tôi đã cố gắng:

#!/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

Điều này đưa ra lỗi "không tìm thấy lệnh" chỉ đến dòng thứ 5 (câu lệnh if). Không có gì lạ, bởi vì tôi đã lặp lại $ char1_atteem và nó mang lại:

6 13 2
6 13 2
6 13 2

Hiện tại, J chỉ muốn nó in ra các dòng như:

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

Xin vui lòng giúp đỡ!


1
Thay thế if $char1 -gt 3bằng if [ "$char1" -gt 3 ]. Nói chung, bất cứ khi nào bạn gặp lỗi cú pháp shell, bước đầu tiên tốt là cắt và dán mã của bạn vào shellcheck.net và sửa lỗi (quan trọng) và cảnh báo (có thể quan trọng) mà nó xác định. Nếu bạn gặp khó khăn trong việc hiểu các thông điệp của nó, thì hãy đến đây và hỏi.
John1024

Câu trả lời:


5

Tôi khuyên bạn nên bắt đầu như thế này:

#!/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"

Bằng cách này, readlưu trữ từ đầu tiên của mỗi dòng trong $numvà phần còn lại của dòng $addr, chỉ nên là địa chỉ IP. Sau đó, bên trong vòng lặp while, chúng tôi kiểm tra xem cả hai không trống và nếu đó là trường hợp, hãy in thông báo.


Và bạn có thể thiết lập i nternal f ield s eparator biến cho các giá trị cách nhau bởi dấu phẩy ( IFS=",").
Pablo A

1
Điều gì đã xảy ra với $char1 -gt 3câu hỏi ( Mục tiêu là chặn IP đó bằng cách sử dụng bộ lọc mạng nếu nỗ lực lớn hơn 3. )? Ngoài ra, thêm ít nhất || [[ -n "$num" ]]có vẻ như là một ý tưởng tốt để bao gồm trường hợp của dòng cuối cùng không kết thúc trong dòng mới.
tráng miệng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.