Grep(1) — linux man page

4 ответа

Findstr звучит так, как ты хочешь. Я постоянно использую его как примерный grep-эквивалент на Windows-платформе.

Другой пример с трубами:

ответ дан
07.12.2019, 07:39

Есть несколько возможностей:

Использовать порт команды Unix . Есть несколько вариантов. Часто упоминаются GNUWin32, cygwin и unxutils. Менее известные, но в некотором роде лучше, инструменты из набора утилит SFUA , которые запускаются в Подсистеме для UNIX-приложений , которая поставляется в комплекте с Windows 7 Ultimate edition и Windows Server 2008 R2. (Для Windows XP можно скачать и установить службы для UNIX версии 3.5 ). Этот инструментарий имеет большое количество инструментов TUI командной строки, от и , через оболочки Korn и C, до и . Он поставляется как со вкусом x86-64 и IA64, так и с вкусом x86-32. Программы работают в родном для Windows POSIX окружении, а не с эмуляторными DLL (такими как ), слоируя вещи поверх Win32. И да, в инструментарии есть , а также около 300 других.

Используйте одну из многих нативных команд Win32 , которые люди написали и опубликовали. Например, у Тима Чаррона есть нативная Win32-версия модифицированного GNU grep. Есть также PowerGREP, Bare Grep, grepWin, AstroGrep и dnGrep, хотя это все GUI-программы, а не TUI-программы.

Используйте прилагаемые и

Синтаксис отличается от синтаксиса , обратите внимание, как и возможность регулярных выражений

ответ дан
07.12.2019, 07:39

В вашей ранней ревизии, которую вы написали MS-DOS, есть только , насколько я знаю. Но это древняя операционная система, которая больше не используется.

В командной строке Windows NT (например, Win2K и выиграть XP и позже, так что, например, win7,win10), вы можете использовать и , и если вы загрузите GnuWin32, то

Основное отличие заключается в том, что findstr имеет поддержку некоторых регулярных выражений. Лучше всего grep поддерживает регулярные выражения.

и показывает, что делают переключатели.

Gnuwin32 имеет «пакеты». Если вы загружаете GnuWin32, я предлагаю пакет coreutils для набора основных полезных утилит, которые вам знакомы, но grep не в этом пакете, это его собственный пакет.

Добавленный

grep GnuWin32, последний раз, когда я проверял, старый. Греп Сигвина гораздо более современный. Также имейте в виду, что многие люди используют виртуальные машины, а не windows-порты *nix-команд.

.

ответ дан
07.12.2019, 07:39

Если вы предпочитаете использовать , а не , то в UnxUtils есть одна версия файла , так что он портативен и нет необходимости его устанавливать, или использовать что-то вроде Cygwin.

.

ответ дан
07.12.2019, 07:39

Examples of Using Grep for Multiple Strings, Patterns and Words

To make sure you understand how to use grep to search multiple strings, we suggest creating a file with some text on which we are going to try out a couple of different use cases.

In our case, we named the file sample.txt and added a few paragraphs of text. We stored the file in the directory of the test user, that is, in /home/test/sample.txt

How to Grep Multiple Patterns in a File

In the examples below, we will use grep instead of extended grep. Do not forget to use the backslash before the pipe character.

Since grep does not support the pipe symbol as the alternation operator, you need to use the escape character (backslash \) to tell the command to treat the pipe differently.

For example, to search for the words extra and value in the sample.txt file use this command:

The output highlights the string you wanted to grep.

If the same file is in another directory, you need to navigate to that directory or use the full path of the file:

To search for more than two words, keep adding them in the same manner.

For example, to search for three words, add the desired string of characters followed by a backslash and pipe:

Let’s see how the above grep command looks when using , , and :

We will use in further examples, but you can use whichever syntax you prefer.

Search for Multiple Exact Matches in a File

If you want to find exact matches for multiple patterns, pass the flag to the command.

For example, the output below shows the difference between searching without and with it:

As you can see, the results are different. The first command shows all lines with the strings you used.

The second command shows how to grep exact matches for multiple strings. The output prints only the lines that contain the exact words.

Note: Grep offers many functionalities. Learn how to use grep for additional use cases.

Ignore Case when Using Grep for Multiple Strings

To avoid missing something when you search for multiple patterns, use the flag to ignore letter case.

For example, we will ignore case with this command:

The output shows how the two commands differ. If you include the flag and ignore letter case, the result for multiple matches includes all matches.

This way, you get additional results. If you also add the flag to this command, you can narrow down the results even further:

Show the Count of Multiple Matches in a File

Let’s say you are monitoring a log file, and you want to see if the number of warnings or messages increases. You don’t want to see detailed results when a large number of matches return.

For example, to show the count of multiple matches in the bootstrap.log file, enter:

The output prints the number of matches. This way, you can quickly determine if the number of warnings and errors increased.

Grep for Multiple Patterns in a Specific File Type

You can use grep to search multiple strings in a certain type of file only. If you want to monitor log files in one directory or if you want to search through all text files, use an asterisk and the file extension instead of a file name.

For example, to search for warnings and errors through all .log files in the /var/log/ directory, enter:

To better demonstrate how this option works, we will only show the count of matches.

The output shows all the files that grep searched through for the strings you used.

Note: If you get a “Permission denied” message, as we did in the example above, you need sudo privileges. To include all files, use with the command. Enter the sudo password, and grep will search through all files.

Search Recursively for Multiple Patterns in a File

The command searches only in the current directory when you use the asterisk wildcard.

To include all subdirectories when searching for multiple patterns, add the operator to grep:

The output will return results from all files the command found in the /var/log/ directory and its subdirectories.

Conclusion

In this tutorial, you learned how to use grep to search multiple words or string patterns in a file. The guide also showed you how to use extended grep.

The examples in this article help you practice how to refine your grep search.

Основы работы с grep

Поиск строки в файле операционной системы Linux Ubuntu осуществляется посредством специальной утилиты — grep. Она позволяет также отфильтровать вывод информации в консоли. Например, вывести все ошибки из log-файла утилиты ps или найти PID определенного процесса в ее отчете.

Команда grep работает с шаблонами и регулярными выражениями. Кроме того, она применяется с другими командами интерпретатора bash.

Синтаксис команды

Для работы с утилитой grep необходимо придерживаться определенного синтаксиса

  1. grep pattern (где options— дополнительные параметры для указания настроек поиска и вывода результата; pattern— шаблон, представляющий строку поиска или регулярное выражение, по которым будет осуществляться поиск; file_name1 file_name2 file_nameN— имя одного или нескольких файлов, в которых производится поиск).
  2. instruction | grep pattern (где instruction — команда интерпретатора bash, options— дополнительные параметры для указания настроек поиска и вывода результата, pattern— шаблон, представляющий строку поиска или регулярное выражение, по которым будет производиться поиск).

Основные опции

  • Отобразить в консоли номер блока перед строкой — -b.
  • Число вхождений шаблона строки — -с.
  • Не выводить имя файла в результатах поиска — -h.
  • Без учета регистра — -i.
  • Отобразить только имена файлов с совпадением строки — -l.
  • Показать номер строки — -n.
  • Игнорировать сообщения об ошибках — -s.
  • Инверсия поиска (отображение всех строк, в которых не найден шаблон) — -v.
  • Слово, окруженное пробелами, — -w.
  • Включить регулярные выражения при поиске — -e.
  • Отобразить вхождение и N строк до и после него — -An и -Bn соответственно.
  • Показать строки до и после вхождения — -Cn.

Поиск подстроки в строке

В окне терминала выводятся все строки, содержащие подстроку. Найденные совпадения подсвечиваются другим цветом.

  • С учетом регистра:
    grep Bourne firstfile.txt
  • Без учета регистра:
    grep -i "Bourne"txt

Вывод нескольких строк

  • Строка с вхождением и две после нее:
    grep -A2 "Bourne"txt
  • Строка с вхождением и три до нее:
    grep -B3 "Bourne"txt
  • Строка, содержащая вхождение, и одну до и после нее:
    grep -C1 "Bourne"txt

Чтение строки из файла с использованием регулярных выражений

Регулярные выражения расширяют возможности поиска и позволяют выполнить разбор строки на отдельные элементы. Они активируются при помощи ключа -e.

  • Вывод строки, в начале которой встречается слово «Фамилия».В регулярных выражения для обозначения начала строки используется специальный символ «^».
    grep "^Фамилия" firstfile.txt

    Чтобы вывести первый символ строки, нужно воспользоваться конструкцией

    grep "^Ф" firstfile.txt
  • Конец строки, заканчивающийся словом «оболочка». Для обозначения конца строки используется мета-символ «$».grep «оболочка$» firstfile.txt Если требуется вывести символ конца строки, то следует применять конструкциюgrep «а.$» firstfile.txt. В этом случае будут выведены все строки, заканчивающиеся на литеру «а».
  • Строки, содержащие числа.
    grep -C1 "Bourne"txt

    Если воспользоваться числовыми интервалами, то можно вывести все строки, в которых встречаются числа:

    grep ""txt

Рекурсивный режим поиска

  • Чтобы найти строку или слово в нескольких файлах, расположенных в одной папке, нужно использовать рекурсивный режим поиска:
    grep -r "оболочка$"
  • Если нет необходимости выводить имена файлов, содержащих искомую строку, то можно воспользоваться ключом-параметром деактивации отображения имен:
    grep -h -r "оболочка$"

Точное вхождение

При поиске союза «и» grep будет выводить все строки, в которых он содержится. Чтобы этого избежать, требуется использовать специальный ключ «w»

grep -w "и" firstfile.txt

Утилита «w» позволяет искать не только одно слово, но и несколько одновременно

grep -w "и | но" firstfile.txt

Количество строк в файле

При помощи grep можно определить число вхождений строки или подстроки в текстовом файле и вывести ее номер.

  • Число вхождений:
    grep -с "Bourne"txt
  • Номера строк с совпадениями:
    grep -n "Bourne"txt

Инверсия

Если в тексте требуется найти определенные строки, которые не содержат какого-либо слова или подстроки, то рекомендуется использовать инверсионный режим поиска.

grep -v "Unix" firstfile.txt

Вывод только имени файла

Чтобы не выводить все строки с совпадением, а вывести только имя файла, нужно воспользоваться конструкцией:

grep -I "Unix" *.txt

Работа с файлами

Команда grep может обрабатывать любое количество файлов одновременно. Создадим три файла:

 123.txt:     alice.txt:              ast.txt:
 1234         Алиса очень             Символ астериска 
 5678         красивая девочка,       обозначается (*)
 89*0         у нее такая ******      звездочкой.
              длинная коса!

И дадим команду:

 grep '*' 123.txt ast.txt alice.txt
 
 123.txt:89*0
 ast.txt:обозначается (*).
 alice.txt:у нее такая ******

В выводе перечислены файлы, и указано, в каком из них какая строка содержит символ астериска. ОБРАЗЕЦ (*) пришлось взять в кавычки, чтобы командный интерпретатор понял, что имеется в виду символ, а не условный знак. Попробуйте без кавычек, увидите — ничего не получится.

Команда grep вовсе не ограничена одним выражением в качестве ОБРАЗЦА, можно задавать хоть целые фразы. Только их нужно заключать в кавычки (одинарные или двойные):

 grep 'ная ко' 123.txt ast.txt alice.txt
 alice.txt:длинная коса!

Возможности поиска при помощи команды grep могут быть значительно расширены применением групповых символов. Например, уже упоминавшийся астериск (звездочка) используется для представления любого символа или группы символов, если речь идет о тексте, и любого файла или группы файлов, если речь идет о директории.

Создадим директорию /example, в которую поместим файлы наших примеров: 123.txt, ast.txt, alice.txt и дадим команду:

 grep '*' example/*
 example/123.txt:89*0
 example/alice.txt:у нее такая ******
 example/ast.txt:обозначается (*)

То есть мы приказали просмотреть все файлы директории /example. Таким способом можно обследовать такие огромные директории как /usr, /dev, и любые другие.

Основное регулярное выражение

GNU Grep имеет три набора функций регулярных выражений : базовый, расширенный и Perl-совместимый.

По умолчанию интерпретирует шаблон как базовое регулярное выражение, где все символы, кроме метасимволов, на самом деле являются регулярными выражениями, которые соответствуют друг другу.

Ниже приведен список наиболее часто используемых метасимволов:

  • Используйте символ (каретка) для сопоставления выражения в начале строки. В следующем примере строка будет соответствовать только в том случае, если она встречается в самом начале строки.

  • Используйте символ (доллар), чтобы найти выражение в конце строки. В следующем примере строка будет соответствовать только в том случае, если она встречается в самом конце строки.

  • Используйте расширение (точка) символ, соответствующий любому одиночному символу. Например, чтобы сопоставить все, что начинается с затем имеет два символа и заканчивается строкой , вы можете использовать следующий шаблон:

  • Используйте (скобки) для соответствия любому одиночному символу, заключенному в квадратные скобки. Например, найдите строки, содержащие или « , вы можете использовать следующий шаблон:

  • Используйте для соответствия любому одиночному символу, не заключенному в квадратные скобки. Следующий шаблон будет соответствовать любой комбинации строк, содержащих , например , и т. Д., Но не будет соответствовать строкам, содержащим ,

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

Исключить слова и шаблоны

Чтобы отображать только те строки, которые не соответствуют поисковому шаблону, используйте параметр (или ).

Например, чтобы напечатать строки, которые не содержат строку, вы должны использовать:

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

По умолчанию учитывается регистр. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные. Чтобы игнорировать регистр при поиске, вызовите с опцией.

Если строка поиска содержит пробелы, вам необходимо заключить ее в одинарные или двойные кавычки.

Чтобы указать два или более шаблонов поиска, используйте опцию:

Вы можете использовать эту опцию сколько угодно раз.

Другой вариант исключения нескольких шаблонов поиска — объединение шаблонов с помощью оператора ИЛИ .

В следующем примере печатаются строки, не содержащие строк или :

GNU поддерживает три синтаксиса регулярных выражений: базовый, расширенный и совместимый с Perl. По умолчанию интерпретирует шаблон как базовое регулярное выражение, в котором метасимволы, например, теряют свое особое значение, и вы должны использовать их версии с обратной косой чертой.

Если вы используете опцию расширенного регулярного выражения , то оператор не следует экранировать, как показано ниже:

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

Вывод команды может быть отфильтрован через конвейер, и на терминале будут напечатаны только строки, соответствующие заданному шаблону.

Например, чтобы распечатать все запущенные процессы в вашей системе, кроме тех, которые выполняются как пользователь «root», вы можете отфильтровать вывод команды:

Выражения в квадратных скобках и Классы символов

В дополнение к совпадению любого символа в заданной позиции в нашем регулярном выражении, мы также, используя выражения в квадратных скобках, можем задать совпадение единичного символа из указанного набора символов. С выражениями в квадратных скобках мы можем указать набор символов для соответствия (включая символы, которые в противном случае были бы истолкованы как метасимволы). В этом примере, используя набор из двух символов:

grep -h 'zip' dirlist*.txt
bzip2
bzip2recover
gzip

мы найдём любые строчки, содержащие строки «bzip» или «gzip».

Набор может содержать любое количество символов, а метасимволы теряют своё специальное значение, когда помещаются внутрь квадратных скобок. Тем не менее, есть два случая в которых метасимволы, используемые внутри квадратных скобок, имеют различные значения. Первый – это каретка (^), которая используется для указания отрицания; второй – это тире (-), которое используется для указания диапазона символов.

Отрицание

Если первым символом выражения в квадратных скобках является каретка (^), то остальные символы принимаются как набор символов, которые не должны присутствовать в заданной позиции символа. Сделаем это изменив наш предыдущий пример:

grep -h 'zip' dirlist*.txt
bunzip2
gunzip
funzip
gpg-zip
mzip
p7zip
preunzip
prezip
prezip-bin
unzip
unzipsfx

С активированным отрицанием, мы получили список файлов, которые содержат строку «zip», перед которой идёт любой символ, кроме «b» или «g»

Обратите внимание, что zip не был найден. Отрицаемый набор символов всё равно требует символ на заданной позиции, но символ не должен быть членом инвертированного набора.

Символ каретки вызывает отрицание только если он является первым символом внутри выражения в квадратных скобках; в противном случае, он теряет своё специальное назначение и становится обычным символом из набора.

Традиционные диапазоны символов

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

grep -h '^' dirlist*.txt
MAKEDEV
GET
HEAD
POST
VBoxClient
X
X11
Xorg
ModemManager
NetworkManager
VBoxControl
VBoxService

Суть в том, что мы разместили все 26 заглавных букв в выражение внутри квадратных скобок. Но мысль печатать их все не вызывает энтузиазма, поэтому есть другой путь:

grep -h '^' dirlist*.txt

Используя трёхсимвольный диапазон, мы можем сократить запись из 26 букв. Таким способом можно выразить любой диапазон символов, включая сразу несколько диапазонов, такие, как это выражение, которое соответствует всем именам файлов, начинающихся с букв и цифр:

grep -h '^' dirlist*.txt

В диапазонах символов мы видим, что символ чёрточки трактуется особым образом, поэтому как мы можем включить символ тире в выражение внутри квадратных скобок? Сделав его первым символом в выражении. Рассмотрим два примера:

grep -h '' dirlist*.txt

Это будет соответствовать каждому имени файла, содержащему заглавную букву. При этом:

grep -h '' dirlist*.txt

будет соответствовать каждому имени файла, содержащему тире, или заглавную «A», или заглавную «Z».

Классы символов POSIX

Подробнее о POSIX вы можете почитать в Википедии.

В POSIX имеются свои классы символов, которые вы можете использовать в регулярных выражениях:

Класс символов Описание
Алфавитно-цифровые символы. В ASCII эквивалентно:
То же самое, что и , с дополнительным символом подчёркивания (_).
Алфавитные символы. В ASCII эквивалентно:
Включает символы пробела и табуляции.
Управляющие коды ASCII. Включает ASCII символы с 0 до 31 и 127.
Цифры от нуля до девяти.
Видимые символы. В ASCII сюда включены символы с 33 по 126.
Буквы в нижнем регистре.
Символы пунктуации. В ASCII эквивалентно: [-!»#$%&'()*+,./:;?@_`{|}~]
Печатные символы. Все символы в плюс символ пробела.
Символы белых пробелов, включающих пробел, табуляцию, возврат каретки, новую строку, вертикальную табуляцию и разрыв страницы. В ASCII эквивалентно:
Символы в верхнем регистре.
Символы, используемые для выражения шестнадцатеричных чисел. В ASCII эквивалетно:

В этих выражениях квадратные скобки и двоеточия являются частью записи класса символов (диапазонов).

Внимание: в зависимости от настроек локали, , , и другие буквенные диапазоны могут включать буквы вашего алфавита, например, русского. Т.е

может соответствовать не , а .

Синтаксис grep и find

Начнём с оператора find. Синтаксис файловой поисковой команды выглядит так:

Некоторые употребительные параметры:

  • -depth : поиск в текущей папке и подкаталогах;
  • -version : вывести версию команды;
  • -print : показывать полные имена файлов (в Linux они могут быть сколь угодно большими);
  • -type f : поиск исключительно файлов;
  • -type d – поиск только директорий (папок).

Перечень доступных опций (указываются через дефис):

  • name : файловый поиск по имени;
  • user : поиск по имени владельца файла;
  • perm : по атрибуту «режим доступа»;
  • mtime : по времени последнего изменения (редактирования) файла;
  • group : по группе;
  • atime : по дате последнего открытия файла;
  • newer : поиск файла с датой, более новой, чем заданная в шаблоне директивы;
  • size : по размеру файла в байтах;
  • nouser : поиск файлов, не имеющих введённого атрибута «владелец».

Синтаксис grep:

Под опциями следует понимать дополнительные уточняющие параметры, например, использование инверсного режима или поиск заданного количество строк.

В шаблоне указывается, что нужно искать, используя непосредственно заданную строку или регулярное выражение.

Возможность использования регулярных выражений позволяет существенно расширить возможности поиска. Указание стандартного вывода может оказаться полезным, если стоит задача отфильтровать ошибки, записанные в логи, или для поиска PID процесса в результатах выполнения команды ps, которые могут быть многостраничными.

Рассмотрим наиболее употребительные параметры grep:

  • -b : выводить номер блока перед выдачей результирующей строки;
  • -c : необходимо подсчитать число вхождений искомого фрагмента;
  • -i : поиск без учёта регистра;
  • -n : выдавать на стандартное устройство вывода номер строки, в которой найден искомый фрагмент или шаблон;
  • – l : в результате выдачи должны присутствовать только имена файлов с найденным поисковым фрагментом;
  • -s : игнорировать вывод ошибок;
  • -w : поиск фрагмента, опоясанного с двух сторон пробелами;
  • -v : инвертированный поиск, то есть отображение всех строк, не содержащих заданный фрагмент;
  • -e : параметр указывает, что далее следует регулярное выражение, имеющее собственный синтаксис;
  • -An : вывод искомого фрагмента и предыдущих n строк;
  • -Bn : то же, но со строками, идущими после шаблона.

Теперь имеет смысл перейти от теоретической части к практической.3

Квантификаторы

Квантификаторы позволяют указать количество вхождений элементов, которые должны присутствовать, чтобы совпадение произошло. В следующей таблице показаны квантификаторы, поддерживаемые GNU :

Квантификатор Описание
Сопоставьте предыдущий элемент ноль или более раз.
Соответствует предыдущему элементу ноль или один раз.
Сопоставьте предыдущий элемент один или несколько раз.
Сравните предыдущий элемент ровно раз.
Сопоставьте предыдущий элемент не менее раз.
Соответствовать предыдущему элементу не более раз.
Сопоставьте предыдущий элемент от до раз.

Символ (звездочка) соответствует предыдущему элементу ноль или более раз. Следующее будет соответствовать «right», «sright», «ssright» и так далее:

Ниже представлен более сложный шаблон, который соответствует всем строкам, которые начинаются с заглавной буквы и заканчиваются точкой или запятой. Регулярное выражение Соответствует любому количеству любых символов:

(знак вопроса) символ делает предыдущий элемент необязательным и может соответствовать только один раз. Следующие будут соответствовать как «ярким», так и «правильным». Символ экранирован обратной косой чертой, потому что мы используем базовые регулярные выражения:

Вот то же регулярное выражение с использованием расширенного регулярного выражения:

Символ (плюс) соответствует предыдущему элементу один или несколько раз. Следующее будет соответствовать «sright» и «ssright», но не «right»:

Фигурные скобки позволяют указать точное число, верхнюю или нижнюю границу или диапазон вхождений, которые должны произойти, чтобы совпадение произошло.

Следующее соответствует всем целым числам, содержащим от 3 до 9 цифр:

Grep несколько шаблонов

GNU поддерживает три синтаксиса регулярных выражений: базовый, расширенный и Perl-совместимый. Если тип регулярного выражения не указан, интерпретирует шаблоны поиска как базовые регулярные выражения.

Для поиска нескольких шаблонов используйте оператор OR (чередование).

Оператор чередования (pipe) позволяет вам указать различные возможные совпадения, которые могут быть буквальными строками или наборами выражений. Этот оператор имеет самый низкий приоритет среди всех операторов регулярных выражений.

Синтаксис поиска нескольких шаблонов с использованием базовых регулярных выражений следующий:

Всегда заключайте регулярное выражение в одинарные кавычки, чтобы избежать интерпретации и расширения метасимволов оболочкой.

При использовании основных регулярных выражений метасимволы интерпретируются как буквальные символы. Чтобы сохранить особые значения метасимволов, они должны быть экранированы обратной косой чертой ( ). Вот почему мы избегаем оператора ИЛИ ( ) косой чертой.

Чтобы интерпретировать шаблон как расширенное регулярное выражение, вызовите с параметром (или ). При использовании расширенного регулярного выражения не избегайте символа оператор:

Для получения дополнительной информации о том, как создавать регулярные выражения, ознакомьтесь с нашей статьей Grep regex .

Комбинируем все вмести

Комбинируя эти три команды, которые являются общими для всех unix систем, мы можем сделать довольно мощный сценарий для замены текста. Большая часть действий происходит от использования команды sed, но другие команды являются вспомогательным для построения запроса. Теперь давайте рассмотрим пример использования всех трех программ вымести:

grep -r -l 'foo' ./ | xargs sed -i 's/foo/bar/g'

Таким образом мы смогли заменить все foo на bar используя простую комбинацию из этих программ.

Теперь когда мы узнали основы по работе таких замечательных инструментах как grep, xargs и sed. Мы сможем писать более продвинутых сценарии для наших задач.

Performance considerations

If you are doing a lot of regular expression matching, including on
very long strings, you will want to consider the options used.
Generally will be faster than the default regular
expression engine, and faster still (especially
when each pattern is matched only a few times).

If you are working in a single-byte locale and have marked UTF-8
strings that are representable in that locale, convert them first as
just one UTF-8 string will force all the matching to be done in
Unicode, which attracts a penalty of around 3x for
the default POSIX 1003.2 mode.

If you can make use of , the strings will not be
checked before matching, and the actual matching will be faster.
Often byte-based matching suffices in a UTF-8 locale since byte
patterns of one character never match part of another.

PCRE-based matching by default used to put additional effort into
‘studying’ the compiled pattern when / has
length 10 or more. That study may use the PCRE JIT compiler on
platforms where it is available (see ). As
from PCRE2 (PCRE version >= 10.00 as reported by
), there is no study phase, but the
patterns are optimized automatically when possible, and PCRE JIT is
used when enabled. The details are controlled by
and .
(Some timing comparisons can be seen by running file
‘tests/PCRE.R’ in the R sources (and perhaps installed).)
People working with PCRE and very long strings can adjust the maximum
size of the JIT stack by setting environment variable
R_PCRE_JIT_STACK_MAXSIZE before JIT is used to a value between
and in MB: the default is . When JIT is
not used with PCRE version < 10.30 (that is with PCRE1 and old
versions of PCRE2), it might also be wise to set the option
.

Параметры grep

Опция -r

—recursive

Еще больше увеличит зону поисков опция -r, которая заставит команду grep рекурсивно обследовать все дерево указанной директории, то есть субдиректории, субдиректории субдиректорий, и так далее вплоть до файлов. Например:

 grep -r menu /boot
 
 /boot/grub/grub.txt:Highlight the menu entry you want to edit and press 'e', then

/boot/grub/grub.txt:Press the key to return to the GRUB menu.
/boot/grub/menu.lst:# GRUB configuration file ‘/boot/grub/menu.lst’.
/boot/grub/menu.lst:gfxmenu (hd0,3)/boot/message

Опция -i

—ignore-case

Приказывает команде игнорировать регистр символов, таким образом, поиск будет производиться как среди заглавных, так и среди строчных букв.

Опция -c

—count

Эта опция не выводит строки, а подсчитывает количество строк, в которых обнаружен ОБРАЗЕЦ. Например:

 grep -c root /etc/group
 8

То есть в восьми строках файла /etc/group встречается сочетание символов root.

—line-number

При использовании этой опции вывод команды grep будет указывать номера строк, содержащих ОБРАЗЕЦ:

Опция -v

—invert-match

Выполняет работу, обратную обычной — выводит строки, в которых ОБРАЗЕЦ не встречается:

 grep -v print /etc/printcap
 #
 #
 # for you (at least initially), such as apsfilter
 # (/usr/share/apsfilter/SETUP, used in conjunction with the
 # LPRng lpd daemon), or with the web interface provided by the
 # (if you use CUPS).

Опция -w

—word-regexp

Заставит команду grep искать только строки, содержащие все слово или фразу, составляющую ОБРАЗЕЦ. Например:

 grep -w "длинная ко" example/*

Не дает вывода, то есть не находит строк, содержащих выражение «длинная ко». А вот команда:

 grep -w "длинная коса" example/*
 
 example/alice.txt:длинная коса!

находит точное соответствие в файле alice.txt.

Опция -x

—line-regexp

Еще более строгая. Она отберет только те строки исследуемого файла или файлов, которые полностью совпадают с ОБРАЗЦОМ.

 grep -x "1234" example/*
 
 example/123.txt:1234

Внимание: Мне попадались (на собственном компьютере) версии grep (например, GNU 2.5), в которых опция -x работала неадекватно. В то же время, другие версии (GNU 2.5.1) работали прекрасно

Если что-то не ладится с этой опцией, попробуйте другую версию, или обновите свою.

Опция -l

—files-with-matches

Команда grep с этой опцией не возвращает строки, содержащие ОБРАЗЕЦ, но сообщает лишь имена файлов, в которых данный образец найден:

 grep -l 'Алиса' example/*
 
 example/alice.txt

Замечу, что сканирование каждого из заданных файлов продолжается только до первого совпадения с ОБРАЗЦОМ.

Опция -L

—files-without-match

Наоборот, сообщает имена тех файлов, где не встретился ОБРАЗЕЦ:

 grep -L 'Алиса' example/*
 
 example/123.txt
 example/ast.txt

Как мы имели случай заметить, команда grep, в поисках соответствия ОБРАЗЦУ, просматривает только содержимое файлов, но не их имена. А так часто нужно найти файл по его имени или другим параметрам, например времени модификации! Тут нам придет на помощь простейший программный канал (pipe). При помощи знака программного канала — вертикальной черты (|) мы можем направить вывод команды ls, то есть список файлов в текущей директории, на ввод команды grep, не забыв указать, что мы, собственно, ищем (ОБРАЗЕЦ). Например:

 ls | grep grep
 
 grep/
 grep-ru.txt

Находясь в директории Desktop, мы «попросили» найти на Рабочем столе все файлы, в названии которых есть выражение «grep». И нашли одну директорию grep/ и текстовой файл grep-ru.txt, который я в данный момент и пишу.

Если мы хотим искать по другим параметрам файла, а не по его имени, то следует применить команду ls -l, которая выводит файлы со всеми параметрами:

 ls -l | grep 2008-12-30
 -rw-r--r-- 1 ya users 27 2008-12-30 08:06 123.txt
 drwxr-xr-x 2 ya users 4096 2008-12-30 08:49 example/
 -rw-r--r-- 1 ya users 11931 2008-12-30 14:59 grep-ru.txt

И вот мы получили список всех файлов, модифицированных 30 декабря 2008 года.

Команда grep незаменима при просмотре логов и конфигурационных файлов. Классически примером использования команды grep стал программный канал с командой dmesg. Команда dmesg выводит те самые сообщения ядра, которые мы не успеваем прочесть во время загрузки компьютера. Допустим, мы подключили через USB порт новый принтер, и теперь хотим узнать, как ядро «окрестило» его. Дадим такую команду:

 dmesg | grep -i usb

Опция -i необходима, так как usb часто пишется заглавными буквами. Проделайте этот пример самостоятельно — у него длинный вывод, который не укладывается в рамки данной статьи.

Назначение операторов find и grep

Команда find в Linux является оператором командной строки для работы с файлами в обход существующей иерархии. Она позволяет производить поиск файлов с использованием множества фильтров, а также выполнять некие действия над файлами после их успешного поиска. Среди критериев поиска файлов – практически все доступные атрибуты, от даты создания до разрешения.

Команда grep в Linux также относится к поисковым, но внутри файлов. Буквальный перевод команды – «глобальная печать регулярных выражений», но под печатью здесь понимается вывод результатов работы на устройство по умолчанию, каковым обычно является монитор. Обладая огромным потенциалом, оператор используется достаточно часто и позволяет производить поиск внутри одного или нескольких файлов по заданным фрагментам (шаблонам). Поскольку терминология в Linuxе существенно отличается от таковой в среде Windows, очень многие пользователи испытывают значительные трудности с использованием этих команд. Постараемся устранить этот недостаток.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: