Попытка получить конкретное поле из read в Ksh

#while-loop #ksh

Вопрос:

Я пытаюсь написать простой скрипт в Ksh, чтобы посмотреть на неудачные попытки и посмотреть ip-адреса. Я сбрасываю вывод lastb в файл и хочу получить только имя пользователя и IP-адрес, с которого он был получен.

вывод последней строки

     user     ssh:notty    143.244.175.142  Mon Jun 21 01:04 - 01:04  (00:00)
    user     ssh:notty    143.244.175.142  Mon Jun 21 00:57 - 00:57  (00:00)
 

мой сценарий выглядит так

     #!/usr/bin/ksh
    FailedLogins="$HOME/sshattempts.txt

    if [ -e "$FailedLogins" ]
    then 
    echo "yes file exists"
    fi

    # while loop 

    while IFS=  read user tty ip
    do
    printf "$user $ip"
    done <"$FailedLogins"
 

Комментарии:

1. Вы пропускаете " вход FailedLogins="$HOME/sshattempts.txt . Я бы назвал файл ssh_attempts.txt , теперь он выглядит так ss_hat_tempts.txt .

Ответ №1:

Вы могли бы использовать что-то вроде этого

 #!/bin/ksh

if [[ -r $HOME/sshattempts.txt ]]; then
    print "yes file $HOME/sshattempts.txt exists"
else
    exit
fi


while read line; do
    parts=( $line )
    print "${parts[0]} ${parts[2]}"
done < $HOME/sshattempts.txt
 

Ответ №2:

Во время обработки каждая строка будет разбита на 10 отдельных полей (разделенных пробелами). Когда переменных недостаточно (в данном случае 3) read , в последнюю переменную будет вставлена «остальная часть строки».

Обработка первой строки из sshattempts.txt приведет к следующим назначениям переменных:

 user='user'
tty='ssh:notty'
ip='143.244.175.142  Mon Jun 21 01:04 - 01:04  (00:00)'
 

Хотя вы можете отредактировать код, чтобы предоставить read 10 переменных, вы можете использовать правило «вставить остаток строки в последнюю переменную», добавив еще одну переменную для хранения всех полей, которые следуют за ip полем, например:

 while IFS= read user tty ip rest_of_line
 

Теперь при обработке первой строки от sshattempts.txt вас должно появиться:

 user='user'
tty='ssh:notty'
ip='143.244.175.142'
rest_of_line='Mon Jun 21 01:04 - 01:04  (00:00)'
 

Ответ №3:

Первая и третья запись строки:

 awk '{print $1, $3}' "$FailedLogins"