Как искать подстроку -в файлах, содержащих другую подстроку -

Связанный вопрос (из автоматической боковой панели):Как предотвратить изменения /sda /sdb между загрузками?


Это гарантирует их назначение в том порядке, в котором они "прощупываются" (или "привязываются" )ядром.

Грег К.Х. выступает за то, чтобы не полагаться на этот приказ. Он любит приводить пример (реального! )Ужасно спроектированная материнская плата, которая повторно -устанавливает порядок PCI между последующими загрузками. Похоже, приведенный выше вопрос касается одного из таких примеров.

Загружаемые модули загружаются пользовательским пространством. udevраспараллеливается с использованием нескольких процессов и не гарантирует загрузку модулей в каком-либо конкретном порядке. Подобная распараллеливание инициализации может иметь реальные преимущества в производительности, поскольку функции инициализации модулей могут выполняться параллельно, и эти функции могут включать длительные задержки в ожидании оборудования.

В настоящее время можно предположить, что ядро ​​по умолчанию должно проверять встроенные -драйверы синхронно и, следовательно, в детерминированном порядке.

As of v4.2 the Linux kernel now sports asynchronous probe support

(по-видимому, эта функция используется ОС Google Chrome ).

https://www.do-not-panic.com/2015/12/linux-asynchronous-probe.html

https://kernelnewbies.org/Linux_4.2#Core

Основываясь на исторических сообщениях , вы могли бы также предположить, что такие усилия вызывают скептицизм/усталость, не в последнюю очередь со стороны Линуса. Основываясь на вышеизложенном, кажется, что какие бы усиленные проверки и/или яростные кричащие сообщения не стояли на пути объединения этого варианта.

Включение его для всего ядра -— это другой вопрос, поскольку «[некоторые] драйверы плохо работают с асинхронным зондированием из-за ошибки драйвера или неоптимальной организации драйвера». Может Линус не взорвался (? )в сообщении объединенной фиксации, в котором говорится, что «конечная цель — сделать зондирование асинхронным по умолчанию», но это только одно мнение, и оно не говорит нам, насколько хорошо оно продвинулось с версии 4.2.

-2
23.07.2020, 17:25
2 ответа

Вы бы предпочли:

grep -rilZ 'first_string'. | xargs -r0 grep -Hi 'second_string'

предполагается, что у вас есть утилиты GNU (, поскольку вы уже используете -rрасширение GNU ).

То есть:

  • используйте -Zи xargs -0для надежной передачи списка путей (, которые в Unix -подобных системах могут содержать любое значение байта, кроме 0, в то время как xargsбез -0ожидает очень специфический формат ).
  • используйте -rдля xargs, чтобы избежать запуска второго grepесли первый не найдет никакого файла (опустив его здесь, это не имеет большого значения, это просто приведет к тому, что второй grepбудет grep пустой стандартный ввод ).
  • Опции
  • должны быть помещены перед аргументами опции, отличной от -.
  • мы используем параметр -Hдля второго grep, чтобы убедиться, что имя файла всегда печатается (даже если ему передается только один путь к файлу ), чтобы мы знали, где находятся совпадения. Для реализаций grep, которые не поддерживают -H, альтернативой является добавление /dev/nullв список файлов для grepпоиска. Тогда grepпри передаче более одного имени файла всегда будет печатать имя файла.
3
18.03.2021, 23:17

find. | perl -ne 'open($fh, $_); $s1=0; $s2=0; while($line = <$fh>) { $s1=1 if($line=~/string 1/); $s2=1 if($line=~/string 2/); } ; print $_ if($s1==1 and $s2 ==1); close $fh;' | sort | uniq

(Это немного долго, чтобы увидеть, но это все в 1 строке)

Редактировать:Некоторые пояснения:

  • find. | отправляет список всех файлов в каталоге, который вы хотите найти, через(.)следующей команде(perl)
  • perl -ne 'COMMANDS'перебирает все строки, которые он получает на STDIN (, поэтому все файлы )и запускает COMMANDSна каждом из них. Имя каждого файла будет каждый раз заканчиваться на$_
  • open($fh, $_); COMMANDS; close $fh;открывает файл, привязывает его к дескриптору файла $fh, запускает COMMANDSи снова закрывает.
  • $s1=0; $s2=0;эти переменные снова устанавливаются в 0 каждый раз, когда запускается следующий файл (если мы находим строку в текущем файле, она устанавливается в 1)
  • while($line = <$fh>) { COMMANDS } ;запускает COMMANDSдля каждой строки в файле.
  • $s1=1 if($line=~/string 1/); $s2=1 if($line=~/string 2/);если string 1найден в текущем файле, $s1станет равным 1, то же самое для$s2
  • print $_ if($s1==1 and $s2 ==1);печатает имя файла, если строки найдены.
  • | sort | uniqсортирует имена файлов и отфильтровывает дубликаты (на самом деле в этом нет необходимости)
0
18.03.2021, 23:17

Теги

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