Проверьте /etc/hosts. Возможно там строка с названием сервера и неверным IP
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
Пробовал с командой AWK без конвейера, протестировано и работает нормально
awk '{for(i=1;i<=NF;i++){if($i ~ /^table/){gsub(";","",$i);print $i}}}' file
выход
table1
table2