Вы должны НИКОГДА не изменяйте sources.list
в Kali Linux. Вот что в них должно быть:
deb http://http.kali.org/kali kali-Rolling main contrib non-free
# Для доступа к пакету исходного кода раскомментируйте следующую строку
# deb-src http://http.kali.org/kali kali-Rolling main contrib non-free
Вероятно, у вас нет подключения к Интернету. Вот почему apt-get update
не удалось.
Используйте переключатель -P
с GNU grep для регулярных выражений Perl, и ваш синтаксис будет работать так, как у вас есть.
$ grep -V | head -n1
grep (GNU grep) 2.25
$ grep --help | grep "\-P"
-P, --perl-regexp PATTERN is a Perl regular expression
Также см. этот ответ для получения дополнительной информации.
Не все регулярные выражения используют одни и те же символы, как уже указывалось другими. Если вы работаете в системе, в которой реализация grep
по умолчанию не является GNU grep
, то у вас есть регулярные выражения POSIX, и они не используют Perl -как шаблоны вроде \s
.
Кажется, вы хотите grep
для строк, заканчивающихся одним положительным целым числом (, а не нулем или более чем одним целым числом ). Глядя на ваши данные, другой способ сформулировать это состоит в том, что вы хотели бы извлечь все строки ровно с тремя полями, разделенными пробелами -.
Это легко сделать с помощьюawk
:
$ awk 'NF == 3' test.log
line2 Patient 432
line4 Patient 321
NF
— это количество полей (столбцов )в текущей записи (строка ), и только с одной строкой условия это действие по умолчанию — распечатать все строки, которые удовлетворяют условию.
С grep
и с более полным шаблоном, который точно определяет, что мы ожидаем:
$ grep -Ex '[[:alnum:]]+ [[:alpha:]]+ [[:digit:]]+' test.log
line2 Patient 432
line4 Patient 321
-E
позволяет использовать расширенные регулярные выражения (, поскольку мы используем расширенный модификатор +
), а -x
приводит к тому, что grep
соответствует полной строке.
[[:alnum:]]+
соответствует буквам и цифрам (в соответствии с вашей локалью ), а [[:alpha:]]+
и [[:digit:]]+
соответствуют буквам и цепочкам цифр соответственно.
Другой способ написать то же самое с использованием диапазонов ASCII (игнорирует настройки вашей локали):
grep -Ex '[A-Za-z0-9]+ [A-Za-z]+ [0-9]+' test.log
Версия grep, которую я использовал grep (BSD grep) 2.5.1-FreeBSD
в своей устаревшей MacOS, не поддерживает -P
, поэтому я установил 3.3 с brew install grep --with-default-names
, а затем смог заставить это работать с:
grep -P 'Patient\s\d+$' test.log