Как выполнить поиск нескольких строк

En estos días, la forma canónica de ejecutar un demonio cuando un dispositivo está conectado parece ser crear una unidad systemd para el demonio y agregar una entrada udev para el dispositivo que hace referencia a esta unidad. Por ejemplo, cree un archivo /etc/udev/rules.d/90-my.rulescon la línea

ACTION=="add", KERNEL=="ttyACM*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="myacm@%k.service"

y un archivo /etc/systemd/system/myacm@.servicecon

[Unit]
Description=my serial daemon for ttyACM0
[Service]
ExecStart=/bin/myscript %i

Es posible que necesite sudo udevadm control --reloady sudo systemctl daemon-reload. Cuando conecte su dispositivo, su secuencia de comandos debe ejecutarse con el parámetro ttyACM0si ese es su nombre. Compruebe los archivos de registro en busca de errores.

Consulte la sección man 7 daemonNuevos -Daemons de estilo y Dispositivo -Activación basada , así como man systemd.device.

0
03.07.2019, 10:44
3 ответа

В системах GNU это сработает для двух шаблонов, если относительный порядок совпадений не имеет значения:

grep -rlZ abc /dir/ | xargs -r0 grep -l def

Вы можете связать это, если у вас больше паттернов, чем два:

grep -rlZ abc /dir/ | xargs -r0 grep -lZ def | xargs -r0 grep -l xxx

или используйтеfind:

find /dir/ -type f -exec grep -q abc {} \; -exec grep -q def {} \; -print

Это не очень эффективно, и для этой задачи может подойти другой инструмент, кроме grep.

1
28.01.2020, 02:22

Гораздо более упрощенная версия grepв режиме --null-data(-z)заключалась бы в использовании жадного квантификатора для сопоставления любого количества новых строк, как

grep -ozP  'abc(.*\n.*){1,}def' file

Или используйте pcregrep (, предоставленный проектом PCRE ), который по умолчанию использует возможности регулярных выражений PCRE. -Mвключает режим согласования нескольких строк -.

pcregrep -M 'abc(.*\n.*){1,}def' file
2
28.01.2020, 02:22

На всякий случай, если у вас могут быть еще более сложные условия, мы можем использовать Awk

awk 'BEGIN{RS="\0"} 
     /def/ && /abc/ {print FILENAME}' *

Где:

  • RS="\0"определяет разделитель регистров, отсутствующий в файле (= файл slurp )и
  • condition {print FILENAME}выводит файлы, соответствующие условию
1
28.01.2020, 02:22

Теги

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