В конфигурации ядра ( make config
, make menuconfig
и т. Д.) Вам необходимо включить CONFIG_MODULE_UNLOAD
:
Когда CONFIG_MODULE_UNLOAD
установлено, ядро считает ссылки, так как вы можете выгрузить модуль только в том случае, если на него нет ссылок.
Если CONFIG_MODULE_UNLOAD
не установлен, ядру не нужно подсчитывать количество ссылок на модуль, и оно всегда возвращает -2
в качестве значения маркера.
Первоначально этот ответ пришел с форумов Gentoo .
Если у вас есть GNUgrep
(по умолчанию в Linux ), вы можете сделать:
grep -Po '(^|\s)\S{64}(\s|$)' file
-P
включает Perl-совместимые регулярные выражения, которые дают нам\b
(слова -границы)\S
(не -пробелы )и{N}
(находят ровно N символов ), а -o
означает «печатать только совпадающую часть строки. Затем мы ищем участки не -пробела длиной ровно 64 символа, которые находятся либо в начале строки (^
), либо после пробела('s
)и которые заканчиваются либо в конце строки ($
), либо другим пробельным символом.
Обратите внимание, что результат будет включать любые пробельные символы в начале и в конце строки, поэтому, если вы хотите продолжить синтаксический анализ, вы можете использовать это вместо этого:
grep -Po '(^|\s)\K\S{64}(?=\s|$)'
Это будет искать пробельный символ или начало строки (\s|^)
, затем отбрасывать его \K
и затем искать 64 не -пробельных символа, за которыми следует ((?=foo)
называется " lookahead " и не будет включаться в соответствие )ни символа пробела, ни конца строки.
Если вы хотите найти все слова длиной 64 из /path/to/file
, вы можете использовать
tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'
Это заменяет все не -буквенно-цифровые символы символами новой строки, поэтому каждое слово находится на отдельной строке. Затем он фильтрует этот результат, чтобы включить только слова длины 64.
Если вы хотите найти 256 -битовое число в шестнадцатеричной форме (64 символа из диапазона 0-9
иA-F
--одного из форматов, в которых может появиться закрытый ключ биткойна ), это должно делать:
egrep -aro '\<[A-F0-9]{64}\>' files and dirs...
Добавьте опцию -i
или также включите диапазон a-f
, если некоторые клавиши написаны строчными буквами.
Для общей проблемы поиска наборов символов из одного класса, имеющих заданную длину, вам лучше использовать регулярные выражения pcre, которые можно использовать с GNU grep с опцией -P
. Например, чтобы найти ряды прописных букв из любого набора символов, минимальной длины 2 и максимальной длины 4, и которые разделены символами, которые не являются прописными буквами:
echo ÁRVÍZtűrő tükörFÚRÓgép |
LC_CTYPE=en_US.UTF-8 grep -Po '(?<!\p{Lu})\p{Lu}{2,4}(?!\p{Lu})'
FÚRÓ
Замените \p{Lu}
на \p{Ll}
для строчных букв, \S
для не -пробелов и т. д. Полный список см. здесь и здесь .
(?<!...)
и (?!...)
являются отрицательными взглядами назад и вперед нулевой -шириной утверждениями; например. (?<!<)\w(?!>)
будет соответствовать символу «слово», если он не заключен в скобки <
и >
. Утверждение \<
нулевой -ширины из vi
может быть реализовано с помощью (?<!\w)(?=\w)
.
Похоже, что grep — правильный инструмент для «поиска» строки. Осталось определить такую строку с помощью регулярного выражения. Первая проблема заключается в определении границ слова. Это не так просто, как «пробел», поскольку a book, a lamp
использует ,
в качестве разделителя слов, в той же концепции многие другие символы или даже начало или конец строки могут действовать как разделитель слов. В GNU grep есть несколько разделителей слов:
\<
начало слова. \>
конец слова. \b
граница слова. Все они предполагают, что слово представляет собой последовательность из [a-zA-Z0-9_]
символов. Если вас это устраивает, это регулярное выражение может работать:
grep -o '\<.\{64\}\>' file
Если бы вы могли использовать расширенное регулярное выражение, \
можно было бы уменьшить:
grep -oE '\<.{64}\>' file
Выбирает от «начала слова» (\<
), 64({64}
)символов(.
)до «конца слова»(\>
)и печатает только совпадающие(-o
)части.
Однако точка(.
)будет соответствовать любому символу , что может быть слишком много.
Если вы хотите быть более строгим при выборе (шестнадцатеричных цифр ), используйте:
grep -oE '\<[0-9a-fA-F]{64}\>' file
Это позволит использовать шестнадцатеричные цифры в нижнем регистре или в верхнем регистре. Но если вы действительно хотите быть строгим, так как некоторые не -символы ASCII могут быть включены, используйте:
LC_ALL=C grep -oE '\<[0-9a-fA-F]{64}\>' file
Некоторые реализации grep (как grep -P )не имеют «начала слова» или «конца слова» (, как \<
и \>
), но имеют «границу слова». "(как\b
):
grep -oP '\b[0-9a-fA-F]{64}\b' file
Некоторые языки принимают границы слов POSIX [[:<:]]
и [[:>:]]
, но не perl и только из PCRE 8.34 .