Как сортировать строки по плавающему номеру

/var/log/dpkg.log должен содержать нужную вам информацию:

От man dpkg :

- log = filename

Журнал обновлений изменений статуса и действия с именем файла вместо стандартного /var/log/dpkg.log.

Если этот параметр указан несколько раз, используется последнее имя файла.

Сообщения журнала имеют вид:

ГГГГ-ММ-ДД ЧЧ: ММ: SS команда типа запуска для каждого вызова dpkg, где тип - это архивы (с командой распаковки или установки) или пакеты (с команда настройки, только триггеры, удаление или очистка);

ГГГГ-ММ-ДД ЧЧ: ММ: состояние SS статус-версия пакета pkg для обновлений изменения статуса;

ГГГГ-ММ-ДД ЧЧ : MM: SS action pkg installed-version available-version для действий, в которых действие - одно из следующих: установка, обновление, настройка, триггерная процедура, исчезновение, удаление или очистка;

и ГГГГ-ММ-ДД ЧЧ: MM: SS conffile filename solution для изменений конфигурации, где решение - установить или сохранить.

например. Я установил ksh сегодня утром, чтобы исследовать разницу между mksh и ksh93 .

# grep ksh /var/log/dpkg.log
2015-11-18 09:39:52 install ksh:amd64 <none> 93u+20120801-2
2015-11-18 09:39:52 status half-installed ksh:amd64 93u+20120801-2
2015-11-18 09:39:52 status half-installed ksh:amd64 93u+20120801-2
2015-11-18 09:39:52 status unpacked ksh:amd64 93u+20120801-2
2015-11-18 09:39:52 status unpacked ksh:amd64 93u+20120801-2
2015-11-18 09:39:57 configure ksh:amd64 93u+20120801-2 <none>
2015-11-18 09:39:57 status unpacked ksh:amd64 93u+20120801-2
2015-11-18 09:39:57 status unpacked ksh:amd64 93u+20120801-2
2015-11-18 09:39:57 status half-configured ksh:amd64 93u+20120801-2
2015-11-18 09:39:57 status installed ksh:amd64 93u+20120801-2

Если вы просто хотите знать, когда пакеты были установлены или обновлены, попробуйте что-нибудь вроде этого:

# zgrep -E '(install|upgrade) bash[: ]' /var/log/dpkg.log*
/var/log/dpkg.log.12.gz:2014-11-25 12:19:59 upgrade bash:amd64 4.3-11 4.3-11+b1
/var/log/dpkg.log.2.gz:2015-09-12 18:52:44 upgrade bash:amd64 4.3-13 4.3-14
/var/log/dpkg.log.4.gz:2015-07-29 10:27:33 upgrade bash:amd64 4.3-12 4.3-13
/var/log/dpkg.log.9.gz:2015-02-09 11:54:56 upgrade bash:amd64 4.3-11+b1 4.3-12

Завершающий [:] в регулярном выражении предназначен для исключения других пакетов, таких как bash -builtins , bash-completion , bash-doc и т. д. из листинга.

0
30.07.2018, 12:36
1 ответ

Я не совсем уверен, как должен выглядеть поток в вашем коде, поэтому приведу два варианта:

  1. Пользователь угадывает до тех пор, пока не угадает правильно текущее слово в файле, затем переходит к угадыванию второго слова и так далее.

  2. Пользователь угадывает текущее слово и переходит к следующему независимо от того, правильное оно или нет.

Вариант первый:

exec 3<&1
n=0
while read word; do
    n=$(( n + 1 ))
    while true; do
        printf 'Word #%d\n' "$n"
        read -p 'guess the word: ' -u 3 guess
        if [ "$guess" = "$word" ]; then
            echo 'correct'
            break
        fi
        echo 'wrong, try again'
    done
done <words
exec 3<&-

Мы не можем просто readвнутри цикла, поскольку это будет читаться из файла . Вместо этого мы читаем из файлового дескриптора 3, который является копией стандартного ввода, сделанного перед циклом. После цикла этот файловый дескриптор закрывается.

Внутренний цикл whileповторяется до тех пор, пока не будет сделано правильное предположение.

Вариант второй:

exec 3<&1
n=0
while read word; do
    n=$(( n + 1 ))
    printf 'Word #%d\n' "$n"
    read -p 'guess the word: ' -u 3 guess
    if [ "$guess" = "$word" ]; then
        echo 'correct'
    else
        echo 'wrong, next word...'
    fi
done <words
exec 3<&-

Это похоже на предыдущий код, но без внутреннего цикла while.

0
28.01.2020, 04:16

Теги

Похожие вопросы