Ваш скрипт считывает весь файл в переменную, а затем перебирает значение этой переменной. Это имеет три проблемы:
*
или [...]
, они будут сопоставляться с существующими именами файлов. В этом ответе используется тот факт, что используемые временные метки разумны в том смысле, что более поздние временные метки сортируются после более ранних (по крайней мере в локали POSIX ).
#!/bin/bash
while IFS= read -r line; do
timestamp=${line%:*} # Remove ":ERR" at the end
timestamp=${timestamp#*:*:} # Remove numbers from start ("0001:3002:")
if [[ "$timestamp" > "$1" ]]; then
# According to the current locale, the timestamp in "$timestamp"
# sorts after the timestamp in "$1".
printf "Greater: %s\n" "$line"
fi
done
Этот скрипт будет принимать отметку времени в том же формате, что и в файле, в качестве единственного аргумента. Он перебирает содержимое файла file
и для каждой строки анализирует метку времени и сравнивает ее с меткой времени в командной строке. Сравнение выполняется с использованием оператора >
в bash
и будет истинным, если временная метка в файле сортируется (лексикографически )после данной временной метки в текущей локали. Если сравнение истинно, печатается строка из файла.
Две отдельные подстановки для извлечения метки времени из строки путем удаления частей конца и начала строки можно заменить на
timestamp=$( cut -d ':' -f 3,4 <<<"$line" )
но это будет работать медленнее, так как вызывает внешнюю утилиту.
Тестирование:
$ bash script.sh '2018/07/16:12.36.00'
Greater: 0008:3002:2018/07/16:12.36.02:ERR
Greater: 0009:3002:2018/07/16:12.36.15:ERR
Если вы хотите вывести только метку времени из файла, а не исходную строку, измените "$line"
на "$timestamp"
в команде printf
.
В этом случае вы также можете ускорить работу, выполнив такой цикл:
#!/bin/bash
cut -d ':' -f 3,4 file |
while IFS= read -r timestamp; do
if [[ "$timestamp" > "$1" ]]; then
# According to the current locale, the timestamp in "$timestamp"
# sorts after the timestamp in "$1".
printf "Greater: %s\n" "$timestamp"
fi
done
Здесь мы используем cut
для получения 3-го и 4-го:
-столбцов с разделителями из файла (отметки времени ), что означает, что нам не нужно выполнять какой-либо анализ исходных строк.
Связанные:
Непонятно, при чем тут «ubuntu Mate».
Для нормальной работы Chromebook нажмите в правом нижнем углу экрана, где находятся часы, затем нажмите на шестеренку, чтобы получить доступ к «настройкам». Оттуда выберите «устройство», а затем «клавиатура». Там вам представлены варианты того, что делают различные клавиши, включая «поиск», «ctrl», «alt», «backspace» и «escape». Один из вариантов - использовать "поиск" как "caps lock".
Изменить :ОП пояснил, что теперь это «как обычный ноутбук», поэтому применяются обычные методы.
Из памяти, учитывая, что OP говорит, что код ключа, сгенерированный ключом поиска, равен 125 (, возможно, найденный из программы xev
)
xmodmap -e 'keycode 125 = Caps_Lock'
xmodmap -e 'add lock = Caps_Lock'
должен установить клавишу Caps_Lock
, а затем заставить клавишу Caps_Lock
функционировать как заглавная буква.
Есть и другие подходы, в частности, загрузка полной карты ключей, что может быть лучше.