Регулярные выражения Linux
В регулярных выражениях могут использоваться два типа символов:
- обычные буквы;
- метасимволы.
Обычные символы — это буквы, цифры и знаки препинания, из которых состоят любые строки. Все тексты состоят из букв и вы можете использовать их в регулярных выражениях для поиска нужной позиции в тексте.
Метасимволы — это кое-что другое, именно они дают силу регулярным выражениям. С помощью метасимволов вы можете сделать намного больше чем поиск одного символа. Вы можете искать комбинации символов, использовать динамическое их количество и выбирать диапазоны. Все спецсимволы можно разделить на два типа, это символы замены, которые заменяют собой обычные символы, или операторы, которые указывают сколько раз может повторяться символ. Синтаксис регулярного выражения будет выглядеть таким образом:
обычный_символ спецсимвол_оператор
спецсимвол_замены спецсимвол_оператор
Если оператор не указать, то будет считаться, что символ обязательно должен встретится в строке один раз. Таких конструкций может быть много. Вот основные метасимволы, которые используют регулярные выражения bash:
- \ — с обратной косой черты начинаются буквенные спецсимволы, а также он используется если нужно использовать спецсимвол в виде какого-либо знака препинания;
- ^ — указывает на начало строки;
- $ — указывает на конец строки;
- * — указывает, что предыдущий символ может повторяться 0 или больше раз;
- + — указывает, что предыдущий символ должен повторится больше один или больше раз;
- ? — предыдущий символ может встречаться ноль или один раз;
- {n} — указывает сколько раз (n) нужно повторить предыдущий символ;
- {N,n} — предыдущий символ может повторяться от N до n раз;
- . — любой символ кроме перевода строки;
- — любой символ, указанный в скобках;
- х|у — символ x или символ y;
- — любой символ, кроме тех, что указаны в скобках;
- — любой символ из указанного диапазона;
- — любой символ, которого нет в диапазоне;
- \b — обозначает границу слова с пробелом;
- \B — обозначает что символ должен быть внутри слова, например, ux совпадет с uxb или tuxedo, но не совпадет с Linux;
- \d — означает, что символ — цифра;
- \D — нецифровой символ;
- \n — символ перевода строки;
- \s — один из символов пробела, пробел, табуляция и так далее;
- \S — любой символ кроме пробела;
- \t — символ табуляции;
- \v — символ вертикальной табуляции;
- \w — любой буквенный символ, включая подчеркивание;
- \W — любой буквенный символ, кроме подчеркивания;
- \uXXX — символ Unicdoe.
Важно отметить, что перед буквенными спецсимволами нужно использовать косую черту, чтобы указать, что дальше идет спецсимвол. Правильно и обратное, если вы хотите использовать спецсимвол, который применяется без косой черты в качестве обычного символа, то вам придется добавить косую черту
Например, вы хотите найти в тексте строку 1+ 2=3. Если вы используете эту строку в качестве регулярного выражения, то ничего не найдете, потому что система интерпретирует плюс как спецсимвол, который сообщает, что предыдущая единица должна повториться один или больше раз. Поэтому его нужно экранировать: 1 \+ 2 = 3. Без экранирования наше регулярное выражение соответствовало бы только строке 11=3 или 111=3 и так далее. Перед равно черту ставить не нужно, потому что это не спецсимвол.
Выражения в квадратных скобках и Классы символов
В дополнение к совпадению любого символа в заданной позиции в нашем регулярном выражении, мы также, используя выражения в квадратных скобках, можем задать совпадение единичного символа из указанного набора символов. С выражениями в квадратных скобках мы можем указать набор символов для соответствия (включая символы, которые в противном случае были бы истолкованы как метасимволы). В этом примере, используя набор из двух символов:
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 эквивалетно: |
В этих выражениях квадратные скобки и двоеточия являются частью записи класса символов (диапазонов).
Внимание: в зависимости от настроек локали, , , и другие буквенные диапазоны могут включать буквы вашего алфавита, например, русского. Т.е
может соответствовать не , а .
6 ответов
Лучший ответ
Используйте флаг GNU Grep
Согласно , вы можете использовать элемент управления префиксом выходной строки для обработки символов ASCII NUL так же, как find и xargs .
Используйте из GNU Coreutils
Как правильно указывает OP, этот флаг наиболее полезен при обработке имен файлов на входе или выходе. Чтобы фактически преобразовать вывод grep для использования символов NUL в качестве окончания строки, вам потребуется использовать такой инструмент, как sed или tr для преобразования каждой строки вывода. Например:
Этот конвейер будет использовать NUL для отделения имен файлов от find , а затем преобразовать символы новой строки в NUL в строках, возвращаемых egrep . Это передаст строки с завершающим NUL следующей команде в конвейере, которая в данном случае просто xargs преобразует вывод обратно в обычные строки, но это может быть что угодно.
50
Todd A. Jacobs
13 Апр 2013 в 16:16
Использовать
Однако шаблон может не содержать новую строку, см. отчет об ошибке .
3
jarno
11 Ноя 2016 в 11:37
Новейшая версия исходного кода GNU grep теперь может использовать / для разделения вывода нулевыми символами, тогда как раньше это работало только вместе с :
Это означает, что ваша проблема решается автоматически при использовании последней версии.
3
Chiel ten Brinke
18 Мар 2016 в 17:11
Поскольку вы уже используете GNU , вы можете использовать его внутренние возможности сопоставления шаблонов регулярных выражений вместо этих , например:
7
jlliagre
4 Дек 2013 в 08:34
-3
Vadim Rudkov
17 Июл 2013 в 20:03
Вместо использования канала вы можете использовать find с терминатором . Чтобы связать несколько команд вместе, вы можете создать оболочку в .
2
jordanm
12 Апр 2013 в 16:37
Утилита sed
Редактор потока данных
(stream editor) или, для краткости, утилита , использует для модификации потока данных.
В данном примере утилита используется для замены строки.
echo Понедельник | sed 's/Понедель/Втор/' Вторник
Слэши могут быть заменены на некоторые другие символы, которые могут оказаться более удобными и повысить читаемость команды в ряде случаев.
echo Понедельник | sed 's:Понедель:Втор:' Вторник echo Понедельник | sed 's_Понедель_Втор_' Вторник echo Понедельник | sed 's|Понедель|Втор|' Вторник
Интерактивный редактор
Несмотря на то, что утилита предназначена для обработки потоков данных, она также может использоваться для интерактивной обработки файлов.
paul@debian7:~/files$ echo Понедельник > today paul@debian7:~/files$ cat today Понедельник paul@debian7:~/files$ sed -i 's/Понедель/Втор/' today paul@debian7:~/files$ cat today Вторник
Простые обратные ссылки
Символ может использоваться для ссылки на искомую (и найденную) строку.
В данном примере используется для удвоения количества найденных строк.
echo Понедельник | sed 's/Понедель/&&/' ПонедельПонедельник echo Понедельник | sed 's/ник/&&/' Понедельникник
Обратные ссылки
Круглые скобки используются для группировки частей регулярного выражения, на которые впоследствии могут быть установлены ссылки.
Рассмотрите следующий пример:
paul@debian7:~$ echo Sunday | sed 's_\(Sun\)_\1ny_' Sunnyday paul@debian7:~$ echo Sunday | sed 's_\(Sun\)_\1ny \1_' Sunny Sunday
Точка для обозначения любого символа
В простой символ точки может обозначать любой символ.
paul@debian7:~$ echo 2014-04-01 | sed 's/....-..-../YYYY-MM-DD/' YYYY-MM-DD paul@debian7:~$ echo abcd-ef-gh | sed 's/....-..-../YYYY-MM-DD/' YYYY-MM-DD
Множественные обратные ссылки
В случае использования более чем одной пары , ссылка на каждую из них может быть осуществлена путем использования последовательных числовых значений.
paul@debian7:~$ echo 2014-04-01 | sed 's/\(....\)-\(..\)-\(..\)/\1+\2+\3/' 2014+04+01 paul@debian7:~$ echo 2014-04-01 | sed 's/\(....\)-\(..\)-\(..\)/\3:\2:\1/' 01:04:2014
Данная возможность называется (grouping).
Пробел
Последовательность символов может использоваться для ссылки на такой символ, как символ пробела или табуляции.
В данном примере осуществляется глобальный поиск последовательностей символов пробелов (\s), которые заменяются на 1 символ пробела.
paul@debian7:~$ echo -e 'сегодня\tтеплый\tдень' сегодня теплый день paul@debian7:~$ echo -e 'сегодня\tтеплый\tдень' | sed 's_\s_ _g' сегодня теплый день
Необязательные вхождения
Символ знака вопроса указывает на то, что предыдущий символ является .
В примере ниже осуществляется поиск последовательности из трех символов o, причем третий символ o является необязательным.
paul@debian7:~$ cat list2 ll lol lool loool paul@debian7:~$ grep -E 'ooo?' list2 lool loool paul@debian7:~$ cat list2 | sed 's/ooo\?/A/' ll lol lAl lAl
Ровно n повторений
Вы можете указать точное количество повторений предыдущего символа.
В данном примере осуществляется поиск строк с ровно тремя символами o.
paul@debian7:~$ cat list2 ll lol lool loool paul@debian7:~$ grep -E 'o{3}' list2 loool paul@debian7:~$ cat list2 | sed 's/o\{3\}/A/' ll lol lool lAl paul@debian7:~$
От n до m повторений
А в данном примере мы четко указываем, что символ должен повторяться от минимального (2) до максимального (3) количества раз.
paul@debian7:~$ cat list2 ll lol lool loool paul@debian7:~$ grep -E 'o{2,3}' list2 lool loool paul@debian7:~$ grep 'o\{2,3\}' list2 lool loool paul@debian7:~$ cat list2 | sed 's/o\{2,3\}/A/' ll lol lAl lAl paul@debian7:~$
Регулярные выражения
Регулярное выражение «regex» или «regexp» — это способ указания универсального шаблона для поиска (определенного набора символов или слов) в тексте, применяемого к входным переменным, для поиска всех вхождений, соответствующих этому шаблону. Регулярные выражения расширяют возможности осмысленной обработки текстового содержимого, особенно в сочетании с другими командами.
Обычно они включаются в команду Grep в следующем формате:
grep
GNU Grep использует версию регулярных выражений GNU, очень похожую (но не идентичную) на регулярные выражения стандарта POSIX. Фактически, большинство разновидностей регулярных выражений очень похожи, но имеют различия в escape-символах, метасимволах или специальных операторах.
GNU Grep имеет два набора функций регулярных выражений: базовый и расширенный. В основных регулярных выражениях мета-символы, , , , и теряют свой особый смысл (их использование мы рассмотрим ниже). Как упоминалось ниже, чтобы переключиться на использование расширенных регулярных выражений, вам необходимо добавить параметр в -команду.
Регулярное выражение принято заключать в одинарные кавычки, чтобы оболочка ( или другие) не пыталась интерпретировать и расширять выражение перед запуском Grep-процесса. Например, если пара косых кавычек — часто называемых backticks) в регулярном выражении не заключена в стандартные одинарные кавычки, это приведет к тому, что текст между ними будет выполняться как подпроцесс .
Далее, если вдруг это окажется допустимой командой, то текст, возвращаемый ею, займет место регулярного выражения в параметрах командной строки, передаваемых Grep! А это не совсем то, что мы хотим.
Мощность regex склонна порождать подобные весьма труднопонимаемые ошибки, поэтому при работе с Grep необходима высокая ясность мышления.
Вы также можете заключить регулярное выражение в двойные кавычки — в этом случае можно использовать в regex переменные среды, подставляемые перед вызовом Grep. Это может быть очень полезно, а может оказаться неприятным сюрпризом, если, опять же, вы не до конца понимаете, что делаете.
Опции — расширения GNU
Опции
-A —after-context=ЧИСЛО_СТРОК
-B —before-context=ЧИСЛО_СТРОК
-C —context=ЧИСЛО_СТРОК
С этими тремя опциями мы уже познакомились в четвертой Хитрости, они позволяют посмотреть соседние строки. -A: количество строк после совпадения с ОБРАЗЦОМ,
-B: количество строк перед совпадением, и -C: количество строк вокруг совпадения.
Опция —colour
Выделяет найденные строки цветом. Значения КОГДА могут быть: never (никогда), always (всегда), или auto. Пример:
grep -o 'английскими' --color grep-ru.txt английскими
Опция -D ДЕЙСТВИЕ
—devices=ДЕЙСТВИЕ
Если исследуемый файл является файлом устройства, FIFO (именованным каналом) или сокетом, то следует применять эту опцию. ДЕЙСТВИЙ всего два: read (прочесть), и skip (пропустить). Если вы указываете ДЕЙСТВИЕ read (используется по умолчанию), то программа попытается прочесть специальный файл, как если бы он был обычным файлом; если указываете ДЕЙСТВИЕ skip, то файлы устройств, FIFO и сокеты будут молча проигнорированы.
Опция -d ДЕЙСТВИЕ
—directories=ДЕЙСТВИЕ
Если входной файл является директорией, то используйте эту опцию. ДЕЙСТВИЕ read (прочесть) попытается прочесть директорию как обычный файл (некоторые ОС и файловые системы запрещают это; тогда появятся соответствующие сообщения, либо директории молча пропустят). Если ДЕЙСТВИЕ skip (пропустить), то директории будут молча проигнорированы. Если ДЕЙСТВИЕ recurse (рекурсивно), то grep будет просматривать все файлы и субдиректории внутри заданного каталога рекурсивно. Это эквивалент опции -r, с которой мы уже познакомились.
—with-filename
Выдает имя файла для каждого совпадения с ОБРАЗЦОМ. Мы успешно делали это без всяких опций в Хитрости второй.
—no-filename
Подавляет вывод имен файлов, когда задано несколько файлов для исследования.
Опция -I
Обрабатывает бинарные файлы как не содержащие совпадений с ОБРАЗЦОМ; эквивалент опции —binary-files=without-match.
Опция —include=ОБРАЗЕЦ_имени_файла
При рекурсивном исследовании директорий обследовать только файлы, содержащие в своем имени ОБРАЗЕЦ_имени_файла.
Опция -m ЧИСЛО_СТРОК
—max-count=ЧИСЛО_СТРОК
Прекратить обработку файла после того, как количество совпадений с ОБРАЗЦОМ достигнет ЧИСЛА_СТРОК:
grep -m 2 'kot' kot.txt kot kotoroe
Опция -y
Синоним опции -i (не различать верхний и нижний регистр символов).
Опции -U и -u применяются только под MS-DOS и MS-Windows, тут нечего о них говорить.
Опция —mmap
Использует системный вызов mmap вместо системного вызова read. Может дать лучшую производительность, а может привести к ошибкам. Это для продвинутых пользователей.
Опция -Z
—null
Если в выводе программы имена файлов (например при опции -l), то опция -Z после каждого имени файла выводит нулевой байт вместо символа новой строки (как обычно происходит). Это делает вывод однозначным, даже если имена файлов содержат символы новой строки. Эта опция может быть использована совместно с такими командами как: find -print0, perl -0, sort -z, xargs -0 для обработки файловых имен, составленных необычно, даже содержащих символы новой строки.
(Хотел бы я знать, как можно включить символ новой строки в имя файла. Если кто знает, не поленитесь — сообщите мне.)
Опция -z
—null-data
Рассматривает ввод как набор строк, каждая из которых заканчивается не символом новой строки, а нулевым байтом. Как и предыдущая опция, используется совместно с вышеперечисленными командами для обработки экзотических имен файлов.
Параметры 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 часто пишется заглавными буквами. Проделайте этот пример самостоятельно — у него длинный вывод, который не укладывается в рамки данной статьи.
Примеры использования Grep
Как упоминалось ранее, если вы не заключите в одинарные кавычки шаблон поиска, переданный в Grep, он изменится. Это также можно сделать намеренно, когда именно это и нужно — давайте рассмотрим несколько примеров.
~]# grep "$HOME" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
Здесь мы специально используем двойные кавычки, чтобы оболочка Bash заменяла переменную среды фактическим значением переменной (в данном случае). Таким образом, Grep ищет в файле текст и выявляет две совпадающие строки.
Напоследок кратко рассмотрим полезные практические примеры использования grep с учетом всех ранее обсуждаемых возможностей.
1. Фильтрация найденных командой grep файлов
Предположим, вам надо отфильтровать содержимое файла , содержащего закомментированные строки. Это можно сделать так:
# grep –v "#" /etc/apache2/sites-available/default-ssl
2. Обнаружение всех файлов с расширением .mp3
Если вам нужно узнать сколько на вашем ПК музыкальных файлов() созданных исполнителем ABC, не являющихся ремиксом — используйте в команду :
# find . –name "*.mp3" | grep –i ABC | grep –vi "remix"
3. Подсчет числа строк, содержащих искомое выражение:
# ifconfig | grep –c inet6
флаг позволяет вести поиск в обоих направлениях.
4. Указание номера искомой строки в файле
При помощи флага -n можно не только вывести необходимые строки, но и их номера.
# grep –n "main" setup.py
5. Рекурсивный поиск строки по всем каталогам
Добавление флага -r запускает рекурсивный поиск:
# grep –r "function" *
6. Совпадения в архивах Gzip
Gzip (GNU Zip) — популярная Linux-утилита, предназначенная для сжатия и декомпрессии файлов. Чтобы выполнить поиск в сжатых архивах — воспользуйтесь командой (которая входит в состав этого архиватора, поставляя свою версию Grep):
# zgrep –i error /var/log/syslog.2.gz
В статье мы разобрались с наиболее часто встречающимися примерами использования команды для сложного поиска — Grep, помогающей администратору при работе с файлами.
Несколько полезных видеороликов по теме:
Ответы 7
Согласно этому статья в блоге Дэймона Кортеси, grep, как вы выяснили, не работает с файлами UTF-16. Однако он представляет собой обходной путь:
Это, очевидно, для Unix, не уверен, что будет эквивалент в Windows. Автор этой статьи также предоставляет шелл-скрипт для выполнения вышеизложенного, который вы можете найти на github здесь.
Это только файлы greps в формате UTF-16. Вы также можете использовать grep для своих файлов ASCII обычным способом.
Вы не сказали, на какой платформе хотите это сделать.
В Windows вы можете использовать PowerGREP, который автоматически обнаруживает файлы Unicode, которые начинаются с отметки порядка байтов. (Также есть возможность автоматически определять файлы без спецификации. Автоопределение очень надежно для UTF-8, но ограничено для UTF-16.)
Спасибо за предложения. Я имел в виду Windows Vista и XP.
Я также обнаружил этот обходной путь, используя бесплатный Sysinternals :
извлекает все найденные строки (из двоичных файлов, но отлично работает и с текстовыми файлами) и добавляет к каждому результату имя файла и двоеточие, поэтому примите это во внимание в регулярном выражении (или используйте вырезание или другой шаг в конвейере). выполняет рекурсивное извлечение, а просто подавляет баннерное сообщение
В конечном итоге я все еще удивлен, что флагманские поисковые утилиты Gnu и не обрабатывают кодировки символов Unicode изначально.
Комментарии (2)
В Windows вы также можете использовать find.exe.
Единственная проблема в том, что при этом печатаются имена файлов, за которыми следуют совпадения. Вы можете отфильтровать их, выполнив команду findstr
Комментарии (1)
Обходной путь — преобразовать ваш UTF-16 в ASCII или ANSI.
Затем вы можете использовать FINDSTR.
Комментарии (1)
можно заменить следующей командой с учетом кодировки символов:
Комментарии (1)
В более поздних версиях Windows UTF-16 поддерживается «из коробки». Если нет, попробуйте изменить активную кодовую страницу командой .
В моем случае, когда использование только не помогало для файлов UTF-16, однако оно работало с :
Другие вопросы по теме
В windows xp: как создать пользователя с доступом на чтение только к одному определенному каталогу?Это ошибка брандмауэра windows xp?Клавиша «windows» как часть сочетания клавишОтказ от расписания задач»ремонт» сетевых подключений программно / из командной строки.Есть ли ловушка windows api для выражения «это приложение требует внимания»?Java ioexception только при запуске новой java 1.6 — кто-нибудь, пожалуйстаЗапуск тестов от имени другого пользователя в visual studioВиртуальный привод с программным управлениемНайдите и запустите vpn-соединение в vb .net