Печатать строки между «2018 -04 -05 13 :00 :00» и «2018 -04 -05 13 :05 :00»
sed -n '/2018-04-05 13:00:00/,/2018-04-05 13:05:00/p' file
или
sed -n /"2018-04-05 13:00:00"/,/"2018-04-05 13:05:00"/p file
Grep для даты начала "2018 -04 -05 13 :00 :00" и вывести следующие 5 строк (=5 минут ), -m1
прекращает поиск после первый матч.
grep -m1 -A5 '2018-04-05 13:00:00' file
Я бы просто использовал grep
и преобразовал массив в строку:
#!/bin/bash
val_arr=(11 22 33)
grep_string=$(tr ' ' '|' <<<"${val_arr[@]}")
first_found=$(grep -wEm1 "$grep_string" list);
if [[ -z $first_found ]]; then
echo "None of the numbers were found"
else
echo "Found: $first_found"
fi
Команда tr
преобразует массив в список элементов, разделенных|
:
$ grep_string=$(tr ' ' '|' <<<"${val_arr[@]}")
$ echo $grep_string
11|22|33
Затем его можно передать в grep -E
. Используемые опции::
-E
:позволяют использовать расширенные регулярные выражения, поэтому мы можем использовать |
для обозначения «ИЛИ». -w
:соответствует только целым словам, так что 3
не соответствует 33
. Вместо этого вы также можете использовать-x
(для соответствия всей строке ), в зависимости от вашего ввода. -m1
:остановить после первого совпадения. Если вам также нужна позиция в файле, добавьте -n
, чтобы он также распечатывал номер строки.
Как насчет того, чтобы превратить val_arr
в шаблон grep или список выражений
$ echo "${val_arr[@]/#/-e}"
-e11 -e44 -e22 -e33
и использовать это напрямую?
$ grep -wFm1 "${val_arr[@]/#/-e}" list
33