как извлечь строку с помощью регулярного выражения с помощью grep?

Проверьте /etc/hosts. Возможно там строка с названием сервера и неверным IP

-1
12.03.2020, 11:46
2 ответа

Grep просто принимает шаблон и файл в качестве аргументов. Как поясняется вman grep:

GREP(1)                          User Commands                         GREP(1)

NAME
       grep, egrep, fgrep - print lines that match patterns

SYNOPSIS
       grep [OPTION...] PATTERNS [FILE...]
       grep [OPTION...] -e PATTERNS... [FILE...]
       grep [OPTION...] -f PATTERN_FILE... [FILE...]

DESCRIPTION
       grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.

Итак, общий формат — grep 'regex' file. Итак, чтобы использовать регулярное выражение из вашего примера, вы должны сделать:

grep 'from (.*?)' file 

Однако это не сработает, поскольку grepиспользует основные регулярные выражения(BRE ), которые не обрабатывают круглые скобки как специальные символы 1 и не понимают не -жадный (оператор поиска кратчайшего соответствия )*?. На самом деле вы хотите:

grep 'from [^[:blank:]]' file 

Здесь используется класс символов BRE [[:blank:]], но он инвертируется с помощью ^([^[:blank:]]), так что теперь он соответствует любому символу, отличному от -пробела. Однако это все еще не то, что вам нужно, поскольку grepвернет всю совпадающую строку , а не только совпавшую часть строки.

Если у вас есть GNUgrep(по умолчанию в Linux ), у вас есть опция -o, которая указывает grepвозвращать только совпадающую часть:

$ grep -o 'from [^[:blank:]]*' file 
from table1;
from table2

Конечно,это все еще не то, что вам нужно, в одном из них есть лишний from, пробел и завершающий ;. Опять же, если у вас есть GNU grep, вы можете использовать PCRE (Perl-совместимые регулярные выражения ), которые поддерживают обходные пути :

.
$ grep -oP '(?<=from )\w+' file 
table1
table2

Здесь -oуказывает grepвозвращать только совпадающую часть, а -Pвключает поддержку PCRE. (?<=from )называется положительным просмотром назад и означает «соответствие следующей части только в том случае, если предыдущая часть соответствует from». Наконец, \w— это специальный класс PCRE, который соответствует «словным символам» :буквам, цифрам и_(и немного большему количеству, если используется Unicode ). Как поясняется вman perlre:

\w        [3]  Match a "word" character (alphanumeric plus "_", plus
               other connector punctuation chars plus Unicode
               marks)

PCRE также имеют изящную \Kфункцию. Это похоже на просмотр назад, но в основном означает «игнорировать все, что соответствует здесь». Используя это, мы можем упростить приведенное выше регулярное выражение до:

$ grep -oP 'from \K\w+' file 
table1
table2
3
28.04.2021, 23:20

Пробовал с командой AWK без конвейера, протестировано и работает нормально

 awk '{for(i=1;i<=NF;i++){if($i ~ /^table/){gsub(";","",$i);print $i}}}' file

выход

table1
table2
0
28.04.2021, 23:20

Теги

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