Найдите точную строку с grep

Можно вывести одно окно экранной сессии с screen -X hardcopy /some/file, это сохранит снимок экрана текущего окна в /some/file.

Можно вывести определенное окно с:

screen -X at 3 hardcopy /some/file

И все они в единственном файле с:

screen -X eval 'hardcopy_append on' 'at \\# hardcopy /some/file'

Можно также вывести один файл на окно путем определения, в каком каталоге вывести их (если Вы не указываете его, затем они будут выведены в каталоге screen был запущен в) с

screen -X eval 'hardcopydir /some/dir' 'at \\# hardcopy'

(будет выведен в названных файлах hardcopy.<n>)

Посмотрите -h опция hardcopy включать буфер прокрутки.

Использовать screen -S опция, как обычно, для определения сессии для выполнения команды в. ⁣   ⁣    ⁣ ⁣

9
24.07.2014, 18:12
5 ответов

Чтобы быть как можно более эффективным, вы хотите остановиться после того, как будет найден первый матч. Если у вас GNU grep, вы можете сделать это:

grep -m 1 '^user1@example\.com$' your_file

Если нет, вы можете использовать Perl:

perl -nlE 'say and last if $_ eq q{user1@example.com}' your_file
6
27.01.2020, 20:04

Смотрите опции -F (фиксированная строка, в отличие от регулярного выражения) и -x (точно: соответствовать всей строке).

grep -Fx user1@example.com text_file

будет эквивалентом:

grep '^user1@example\.com$' text_file

(помните, что . является оператором регулярного выражения, который соответствует любому символу).

Используйте опцию -q, если хотите проверить только наличие такой строки:

grep -Fxq user1@example.com text_file &&
  echo yes, that address is in that file.

Если строка для поиска и имя файла переменная:

grep -Fxqe "$email" < "$file"

Или

grep -Fxq -- "$email" < "$file"

Вы не хотите:

grep -Fxq "$email" "$file"

так как это может вызвать проблемы, если $email или $file начинается с -.

Если файл отсортирован (в вашей текущей локали, желательно C), вы можете ускорить процесс, используя com вместо grep:

printf '%s\n' user1@example.com | comm -12 - text_file

Преимущество станет более очевидным, когда у вас будет несколько адресов электронной почты для проверки (например, в другом отсортированном файле):

comm -12 text_file emails_to_check

было бы быстрее, чем:

grep -Fxf emails_to_check text_file
24
27.01.2020, 20:04

Там много проверок электронной почты. Одна из них:

grep -E -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" text_file

Для уточнения ответа.

Вы используете якорь ^, который указывает на начало строки. Это не будет совпадать, если адрес электронной почты находится где-то между длинной строкой.

3
27.01.2020, 20:04

ваша команда grep будет соответствовать всему, что начинается с ^user1@example.com, включая сам адрес электронной почты, а также user1@example.com.spammer.com. Начиная с . является специальным символом в регулярных выражениях, который совпадает с любым ключом, его следует экранировать как \.

предполагая, что ваш текстовый файл содержит один адрес в строке, используйте:

EMAIL=user1@example\\.com
egrep "^${EMAIL}$" text_file

трейлинг $, чтобы убедиться, что строка заканчивается после адреса электронной почты. я также использую двойные кавычки ", так как они позволяют использовать переменные (в отличие от одиночных кавычек ')

.
2
27.01.2020, 20:04

Учитывая общее буквальное / точное соответствие строки:

grep -w "search_word" <file>  >  output.txt

#\b shows boundaries over here.

или,

 grep  "\bsearch_word\b"  <file>  >  output.txt 
0
27.01.2020, 20:04

Теги

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