grep не работает должным образом

  1. Вы должны НИКОГДА не изменяйте 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 
     
  2. Вероятно, у вас нет подключения к Интернету. Вот почему apt-get update не удалось.

0
06.02.2019, 13:32
3 ответа

Используйте переключатель -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

Также см. этот ответ для получения дополнительной информации.

2
28.01.2020, 02:18

Не все регулярные выражения используют одни и те же символы, как уже указывалось другими. Если вы работаете в системе, в которой реализация 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
1
28.01.2020, 02:18

Версия 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
1
28.01.2020, 02:18

Теги

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