Сценарий Bash для поиска элемента списка, который появляется первым во втором списке

Печатать строки между «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
3
22.04.2020, 15:28
2 ответа

Я бы просто использовал 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, чтобы он также распечатывал номер строки.

4
19.03.2021, 02:27

Как насчет того, чтобы превратить val_arrв шаблон grep или список выражений

$ echo "${val_arr[@]/#/-e}"
-e11 -e44 -e22 -e33

и использовать это напрямую?

$ grep -wFm1 "${val_arr[@]/#/-e}" list
33
4
19.03.2021, 02:27

Теги

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