Когда драйвер запрашивает общий IRQ, он передает указатель на ядро к ссылке на устройство определенная структура в пространстве памяти драйвера.
Каждый раз, когда два или больше драйвера совместно используют линию прерывания и аппаратные прерывания процессор на той строке, ядро вызывает каждый обработчик, зарегистрированный для того прерывания, передавая каждый его собственный dev_id.
После проверки обработчиков IRQ нескольких драйверов кажется, что они зондируют сами аппаратные средства, чтобы определить, должно ли это обработать прерывание или возврат IRQ_NONE
.
status = inw(uhci->io_addr + USBSTS);
if (!(status & ~USBSTS_HCH)) /* shared interrupt, not mine */
return IRQ_NONE;
В коде выше, драйвер читает USBSTS
регистр, чтобы определить, существует ли прерывание к сервису.
intmask = sdhci_readl(host, SDHCI_INT_STATUS);
if (!intmask || intmask == 0xffffffff) {
result = IRQ_NONE;
goto out;
}
Так же, как в предыдущем примере, драйвер проверяет регистр состояния, SDHCI_INT_STATUS
определить, должно ли это обслужить прерывание.
struct ath5k_softc *sc = dev_id;
struct ath5k_hw *ah = sc->ah;
enum ath5k_int status;
unsigned int counter = 1000;
if (unlikely(test_bit(ATH_STAT_INVALID, sc->status) ||
!ath5k_hw_is_intr_pending(ah)))
return IRQ_NONE;
Просто еще один пример.
Вы - более обеспеченное использование awk или sed
awk '/CK$/,/D$/' file.txt
ИЛИ
sed -n '/CK$/,/D$/p' file.txt
Если Вы настаиваете на grep, вот является GNU grep путем
grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt
Здесь
-P
активирует perl-regexp
-z
разделитель строки наборов к NUL. Это вынуждает grep рассматривать весь файл как одну одну строку
-o
печать, только соответствующая
(?s)
активирует PCRE_DOTALL, таким образом, .
находит любую символьную или новую строку
\N
соответствия что-либо кроме новой строки
.*?
находит. в нежадном режиме
(?<=..)
оглянуться утверждение
(?=..)
предварительное утверждение
Если вы используете BSD grep
(не поддерживает perl regex param -P
), вот обходной путь:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'
Это работает путем конкатенации всех строк (заменяя новые строки символом _
), проверки однострочного шаблона и расширения строк до исходного состояния.
Если вы используете GNU grep
, вы можете добиться многострочного совпадения в grep
, но вам нужно использовать perl-regexp для grep
(-P
), как упоминалось в другом ответе. Вы все еще можете установить GNU grep
на macOS через brew install grep
и использовать ggrep
вместо него.
Также вы можете использовать pcregrep
который поддерживает многострочные шаблоны (-M
).
Вы также можете использовать команду ex
, например:
ex +"/aaa/;/cdn/p" -scq! file
`awk '/CK$/{f=1}/D$/{f=0;print;exit}f' filename
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
Использование Perl (5):
perl -nE 'print $_ if /CK$/.../D$/;'
Использование Raku (, ранее известного как Perl _6):
raku -ne 'put $_ if /CK$/fff/D$/;'
Обе строки кода выше используют sed -как оператор «флип -флоп». В Perl5 sed -как «флип -флоп» пишется ...
. В Раку sed -как «флип -флоп» пишется fff
.
Пример ввода:
kkkkkkkkkkk
jjjjjjjjjjjjjjjjjj
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
GGGGGGGGGGGGGG
GGGGGGGGGGGGGG
Пример вывода (Perl5 или Raku):
gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D
Обратите внимание, поскольку Раку использует точку .
для цепочки операций, код Раку, начинающийся put $_
…, можно записать $_.put
…. Кроме того, если цепочка методов начинается с точки .
, Raku по умолчанию вызывает цепочку для переменной темы $_
. Таким образом, код Раку, представленный выше, может быть сокращен до $_.put
… и еще более сокращен до .put
….
awk '/\/CK/,/\/D/' input
– Rahul Patil 08.11.2013, 19:37