Формат длинных списков
По умолчанию вывод команды показывает только имена файлов и каталогов, что не очень информативно.
Параметр (нижний регистр L) указывает печатать файлы в формате длинного списка.
Когда используется формат длинного списка, вы можете увидеть следующую информацию о файле:
- Тип файла.
- Права доступа к файлу.
- Количество жестких ссылок на файл.
- Владелец файла.
- Файловая группа.
- Размер файла.
- Дата и время.
- Имя файла.
Вот пример:
Давайте объясним самые важные столбцы вывода.
Первый символ показывает тип файла. В этом примере первый символ , что указывает на обычный файл. Значения для других типов файлов следующие:
- — Обычный файл.
- — Заблокировать специальный файл.
- — Символьный специальный файл.
- — Справочник.
- — символическая ссылка.
- — Сетевой файл.
- — ФИФО.
- — Розетка.
Следующие девять символов показывают права доступа к файлу. Первые три символа предназначены для пользователя, следующие три — для группы, а последние три — для остальных. Вы можете изменить права доступа к файлу с помощью команды . Символ разрешения может принимать следующие значения:
- — Разрешение на чтение файла.
- — Разрешение на запись в файл.
- — Разрешение на выполнение файла.
- — бит .
- — бит.
В нашем примере означает, что пользователь может читать и записывать файл, а группа и другие пользователи могут только читать файл. Цифра после символов разрешения — это количество жестких ссылок на этот файл.
Следующие два поля показывают владельца файла и группу, за которыми следует размер файла ( ), показанный в байтах. Используйте параметр если вы хотите печатать размеры в удобочитаемом формате. Вы можете изменить владельца файла с помощью команды .
— дата и время последнего изменения файла.
Последний столбец — это имя файла.
9 ответов
101
Если в файле присутствует символ , grep будет рассматривать его как двоичный файл.
Там может быть обходной путь, такой как , чтобы сначала устранить все null, а затем выполнить поиск по файлу.
80
работал для меня:
20
Вы можете использовать утилиту , чтобы извлечь текстовый контент из любого файла, а затем передать его через , например: .
11
GNU grep 2.24 RTFS
Вывод: только 2 и 2 случая:
-
, например.
-
ошибка кодирования в соответствии с C99 , например:
, потому что не может быть первым байтом UICF-8 Unicode:
Кроме того, как упоминалось Стефаном Чазеласом , эти проверки выполняются только до первого буфера, считывающего длину TODO.
Только до первого буфера прочитайте
Итак, если ошибка NUL или кодирования происходит в середине очень большого файла, она может быть grepped в любом случае.
Я предполагаю, что это по соображениям производительности.
Например: это печатает строку:
, но это не так:
Размер фактического буфера зависит от того, как файл читается. Например. Для сравнения:
С первая строка передается в grep, даже если она длится всего 1 байт, потому что процесс переходит в спящий режим, а второй read не проверяет, является ли файл двоичным.
RTFS
Найдите, где закодировано сообщение об ошибке stderr:
Подводит нас к :
Если эти переменные были хорошо названы, мы в основном пришли к выводу.
encoding_error_output
Быстрый grepping для показывает, что единственный путь к нему, который может его изменить, проходит через :
, затем просто .
nlines_first_null и nlines
Инициализируется как:
, поэтому, когда найден нуль , становится истинным.
TODO, когда может когда-либо были ложными? Я ленился.
POSIX
Не определяет двоичные параметры grep — поиск файла для шаблона | pubs.opengroup.org , а GNU grep не документирует его, поэтому RTFS — единственный способ.
6
Один из моих текстовых файлов внезапно воспринимался как двоичный файл grep:
Решение заключалось в том, чтобы преобразовать его с помощью :
5
В файле или имеется список последовательностей, которые использует команда для определение типа файла.
Примечание , что двоичный файл может быть просто резервным решением. Иногда файлы со странной кодировкой считаются также двоичными.
в Linux есть некоторые опции для обработки двоичных файлов, таких как или
2
У одной из моих учеников была эта проблема. В есть ошибка в . Если в файле есть символы, отличные от Ascii, и , см. Его как двоичный.
2
Собственно, отвечая на вопрос «Что делает grep считать файл двоичным?», вы можете использовать :
В моем случае были испанские символы, которые правильно отображались в текстовых редакторах, но grep считал их двоичными; Результат указал мне номера строк и столбцов этих символов
В случае символов , будет считать их нормальными и не будет печатать такой вывод, поэтому этот метод не подходит
1
У меня была та же проблема. Я использовал , чтобы увидеть добавленные символы. Я нашел управляющие символы и . Затем в vi введите , чтобы удалить символы . Повторите эту команду для .
Предупреждение. Чтобы получить «синие» управляющие символы, нажмите Ctrl + v , затем Ctrl + M или Ctrl + @ . Затем сохраните и выйдите из vi.
Выражения в квадратных скобках и Классы символов
В дополнение к совпадению любого символа в заданной позиции в нашем регулярном выражении, мы также, используя выражения в квадратных скобках, можем задать совпадение единичного символа из указанного набора символов. С выражениями в квадратных скобках мы можем указать набор символов для соответствия (включая символы, которые в противном случае были бы истолкованы как метасимволы). В этом примере, используя набор из двух символов:
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 эквивалетно: |
В этих выражениях квадратные скобки и двоеточия являются частью записи класса символов (диапазонов).
Внимание: в зависимости от настроек локали, , , и другие буквенные диапазоны могут включать буквы вашего алфавита, например, русского. Т.е
может соответствовать не , а .
Синтаксис
Параметры
Параметр | Описание |
---|---|
/b | Соответствует шаблону текста, если он находится в начале строки. |
/e | Соответствует шаблону текста, если он находится в конце строки. |
/l | Обрабатывает строки поиска буквально. |
/r | Обрабатывает строки поиска в виде регулярных выражений. Это параметр по умолчанию. |
/s | Выполняет поиск в текущем каталоге и во всех подкаталогах. |
/i | Игнорирует регистр символов при поиске строки. |
/x | Выводит строки, которые точно соответствуют друг другу. |
/v | Выводит только те строки, которые не содержат совпадений. |
/n | Выводит номер строки каждой соответствующей строки. |
/m | Печатает только имя файла, если файл содержит совпадение. |
/o | Выводит смещение символов перед каждой совпадающей строкой. |
/p | Пропускает файлы с непечатаемыми символами. |
«/OFF» | Не пропускает файлы с установленным атрибутом offline. |
ключа | Возвращает список файлов из указанного файла. |
/c: | Использует указанный текст в качестве литеральной строки поиска. |
/g | Возвращает строки поиска из указанного файла. |
/d | Выполняет поиск в указанном списке каталогов. Каждый каталог должен быть отделен точкой с запятой (например,;) . |
Задает атрибуты цвета с двумя шестнадцатеричными цифрами. Введите дополнительные сведения. | |
Задает текст для поиска в файле filename. Обязательный элемент. | |
Указывает расположение и файл или файлы для поиска. Требуется по крайней мере одно имя файла. | |
/? | Отображает справку в командной строке. |
Комментарии
-
Все параметры командной строки findstr должны предшествовать строкам и именам файлов в строке команды.
-
Для поиска шаблонов текста в регулярных выражениях используются как литеральные символы, так и мета-символы, а не точные строки символов.
-
Литеральный символ — это символ, который не имеет особого значения в синтаксисе регулярных выражений; Вместо этого он соответствует вхождению этого символа. Например, буквы и цифры являются литеральными символами.
-
Мета-символ — это символ с особым значением (оператор или разделитель) в синтаксисе регулярных выражений.
Допустимые мета-символы:
Мета-символ Значение Подстановочный знак — любой символ Повтор — ноль или более вхождений предыдущего символа или класса. Начальное расположение строки — начало строки. Конечное расположение строки — конец строки. Класс символов — любой символ в наборе. Обратный класс — любой символ, не наявляющийся в наборе. Range — все символы в указанном диапазоне. Escape -литеральное использование мета-символа. Начальное расположение слова — начало слова. Конечное расположение слова -конец слова. Специальные символы в синтаксисе регулярных выражений обеспечивают наибольшее энергопотребление при совместном использовании. Например, используйте сочетание символа-шаблона ( ) и Repeat ( ), чтобы соответствовать любой строке символов:
Используйте следующее выражение как часть выражения большего размера для сопоставления любой строки, начинающейся с b , и заканчивая оператором with:
-
-
Для поиска нескольких строк в наборе файлов необходимо создать текстовый файл, содержащий каждый критерий поиска в отдельной строке.
-
Используйте пробелы для разделения нескольких строк поиска, если только аргумент не имеет префикса с параметром /c.
Примеры
Для поиска Helloили в файле x. yвведите:
Чтобы найти Hello в файле x. y, введите:
чтобы найти все вхождения слова Windows (начальная прописная буква W) в файле proposal.txt, введите:
для поиска всех файлов в текущем каталоге и всех подкаталогах, содержащих слово Windows, независимо от регистра букв, введите:
Чтобы найти все вхождения строк, начинающихся с и, предшествует нулю или большему числу пробелов (как в цикле компьютерной программы ) и для вывода номера строки, где найдено каждое вхождение, введите:
Чтобы получить список точных файлов, которые необходимо найти в текстовом файле, используйте условия поиска в файле stringlist.txt, чтобы найти файлы, перечисленные в filelist.txt, а затем сохраните результаты в файле Results. out, введите:
Чтобы получить список всех файлов, содержащих слово Computer в текущем каталоге и всех подкаталогах, не зависимо от регистра, введите:
Чтобы получить список всех файлов, содержащих слово Computer, и других слов, начинающихся с «Comp» (например, «Привет» и «конкурировать»), введите:
2 ответа
В зависимости от того, что вы хотите сделать с выходным файлом, можно добавить цвета в обычный текстовый файл, потому что цвета просто исходят от некоторых специальных символов. Греп, похоже, не хочет печатать их при перенаправлении его в файл, поэтому вам нужно заставить его:
Теперь, когда вы печатаете файл на консоли, он будет напечатан с помощью цвета, потому что Bash интерпретирует эти символы как «использовать этот цвет».
Однако, если вы откроете его в редакторе, например vim, вы получите некоторые странные символы. Например, когда я использую команды
Выход выглядит правильно, когда я печатаю его с помощью cat, но когда я его открываю в vim, я получаю
Поэтому, если вы хотите использовать редактор, это, вероятно, не то, что вы хотите.
ответ дан
24 May 2018 в 05:17
Если я правильно понял, вы хотите сохранить вывод терминала в текстовом файле, не так ли? Но вы хотите, чтобы он был отформатирован с цветами. Если это так, вот мои идеи:
Выделение вывода автоматически
Как вы, вероятно, знаете, если вы записываете вывод grep в текстовый файл, именно потому, что это текст файл не может быть сформирован. Итак, насколько я знаю, вы не можете сделать это легко.
Несмотря на то, что есть простой обходной путь, заключающийся в том, чтобы реализовать свой текстовый редактор, какой файл открывается. Например, предположим, что ваш выход grep имеет некоторые компоненты bash, поэтому фоны bash работают для вас (кстати, часто это цвета, которые вы видите на цветном выходе в терминале). Таким образом, трюк заключается в том, чтобы сохранить вывод текста в файле с соответствующим расширением. Вместо того, чтобы делать что-то вроде:
, вы можете пойти на
Что сделает gedit (или любой достойный текстовый редактор) автоматически распознать, что вы говорите о bash кода, и выделит его соответствующим образом. Вам не нужно окрашивать вывод, программа сделает это для вас, если распознает тип кода, который он открывает. Если вы работаете с форматами другого типа, просто адаптируйте расширение к тому, чтобы лучше настроить то, что вы используете (например,> output.xml,> output.html,> output.py … и т. Д.). Удачи!
Выделение некоторых слов в выходном файле
Итак, если я его получил, вы хотите выделить слова, которые искали. Опять же, это невозможно сделать в текстовом файле просто потому, что это простой текст. Однако вы можете добавить в него некоторый формат очень простым способом, например, с использованием некоторого кодирования html. Это преобразует ваш результат в html-код, и когда вы откроете его с помощью программы, способной интерпретировать html (libreoffice writer, firefox и 10000 и т. Д.), Вы увидите некоторые слова с высокой яркостью.
Для этого предположим, что это ваш grep, экспортированный в html:
И теперь вы хотите выделить ключевой текст в своем выходе. Вы можете использовать sed, чтобы сделать это, например:
И violà, теперь ваш ключевой текст выделен красным цветом.
ответ дан
24 May 2018 в 05:17
Непечатаемые символы
Можно обнаружить, что имя файла имеет непечатаемый или управляющий символ в его имени файла. Обычно это может произойти, когда вы расширяете архив, который вы скачали из Интернета или извлекаете из репозитория git, и исходный автор допустил ошибку при создании файла, но не заметил ее.
Наш странный файл — один из таких:
Если мы посмотрим на него в браузере файлов и нажмем «F2», чтобы переименовать его, непечатаемые символы будут представлены странным символом.
Вы можете использовать опцию -b (escape), чтобы увидеть, что на самом деле содержит имя файла. Эта опция заставляет ls использовать escape-последовательности Язык программирования C для представления управляющих символов.
ls -b a*
Таинственный символ оказывается символом новой строки, представленным в C как «n».
3 ответа
17
С GNU :
Объяснение:
- => Распечатайте только то, что вы сопоставляете
- => Использовать регулярные выражения в стиле Perl
- Регулярное выражение соответствует совпадению от 0 до , за которыми следует , за которым следуют символы от 0 до .
Если у вас нет GNU :
Объяснение:
Поскольку мы больше не можем полагаться на на GNU , мы используем для поиска файлов рекурсивно ( действие GNU ). Для каждого найденного файла мы выполняем фрагмент Perl.
Переключатели Perl:
- Прочитать файл по строкам
- Удалите новую строку в конце каждой строки и верните ее при печати
- Обработать следующую строку как код
Фрагмент Perl делает по существу то же самое, что и . Он начинается с установки переменной на количество символов контекста, которые вы хотите. означает, что это выполняется только один раз в начале выполнения не один раз для каждой строки в каждом файле.
Операция, выполняемая для каждой строки, заключается в том, чтобы печатать строку, если подстановка регулярного выражения работает.
Регулярное выражение:
- Сопоставьте любую старую вещь лениво 1 в начале строки (), а затем , как в случае с кодом , а затем , а затем другой и, наконец, сопоставить любой старый вещь лениво до конца строки ().
- Подставим это с помощью . — магическая переменная, которая содержит имя текущего файла, который читается. — это то, что соответствует parens: контекст в этом случае.
- Требуются ленивые совпадения с обоих концов, потому что жадный матч будет употреблять все символы до без соответствия (с разрешено совпадать с нулевым временем).
1 То есть, предпочитайте не соответствовать чему-либо, если это не приведет к сбою общего совпадения. Короче говоря, сопоставляйте как можно больше символов.
17
Попробуйте использовать это:
-E сообщает, что вы хотите использовать расширенное регулярное выражение
-o сообщает, что вы хотите напечатать только совпадение
-r grep ищет рекурсивно результат в папке
REGEX:
{0,10} указывает, сколько произвольных символов вы хотите распечатать
. представляет собой произвольный символ (сам символ не имеет значения, просто его число)
Изменить: О, я вижу, Иосиф рекомендует почти то же самое решение, что и я: D
Взято из: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
а также
https://stackoverflow.com/a/39029954/1150462
Предлагаемый подход отлично подходит, за исключением того, что цвет подсветки часто перепутался. Я создал скрипт с аналогичным результатом, но цвет также сохраняется:
Предполагая, что сценарий сохраняется как , затем должен отображать соответствующие строки, но всего 10 символов вокруг соответствующей строки.
Опции — расширения GNU
Опции
-A —after-context=ЧИСЛО_СТРОК
-B —before-context=ЧИСЛО_СТРОК
-C —context=ЧИСЛО_СТРОК
Опция -D ДЕЙСТВИЕ
Если исследуемый файл является файлом устройства, FIFO (именованным каналом) или сокетом, то следует применять эту опцию. ДЕЙСТВИЙ всего два: read (прочесть), и skip (пропустить). Если вы указываете ДЕЙСТВИЕ read (используется по умолчанию), то программа попытается прочесть специальный файл, как если бы он был обычным файлом; если указываете ДЕЙСТВИЕ skip, то файлы устройств, FIFO и сокеты будут молча проигнорированы.
Опция -d ДЕЙСТВИЕ
Если входной файл является директорией, то используйте эту опцию. ДЕЙСТВИЕ read (прочесть) попытается прочесть директорию как обычный файл (некоторые ОС и файловые системы запрещают это; тогда появятся соответствующие сообщения, либо директории молча пропустят). Если ДЕЙСТВИЕ skip (пропустить), то директории будут молча проигнорированы. Если ДЕЙСТВИЕ recurse (рекурсивно), то grep будет просматривать все файлы и субдиректории внутри заданного каталога рекурсивно. Это эквивалент опции -r, с которой мы уже познакомились.
Выдает имя файла для каждого совпадения с ОБРАЗЦОМ. Мы успешно делали это без всяких опций в Хитрости второй.
Подавляет вывод имен файлов, когда задано несколько файлов для исследования.
Опция -m ЧИСЛО_СТРОК
Прекратить обработку файла после того, как количество совпадений с ОБРАЗЦОМ достигнет ЧИСЛА_СТРОК:
$ grep -m 2 'kot' kot.txt kot kotoroe
Опция -Z
Если в выводе программы имена файлов (например при опции -l), то опция -Z после каждого имени файла выводит нулевой байт вместо символа новой строки (как обычно происходит). Это делает вывод однозначным, даже если имена файлов содержат символы новой строки. Эта опция может быть использована совместно с такими командами как: find -print0, perl -0, sort -z, xargs -0 для обработки файловых имен, составленных необычно, даже содержащих символы новой строки.
(Хотел бы я знать, как можно включить символ новой строки в имя файла. Если кто знает, не поленитесь — сообщите мне.)
Опция -z
Рассматривает ввод как набор строк, каждая из которых заканчивается не символом новой строки, а нулевым байтом. Как и предыдущая опция, используется совместно с вышеперечисленными командами для обработки экзотических имен файлов.
uniq – сообщает о повторяющихся строках или удаляет их
Команда uniq удаляет одинаковые строки или показывает их. Но она «видит» одинаковые строки только если они являются смежными (следуют друг за другом). Т.е. перед применением команды uniq, записи в файле нужно отсортировать. Для этого применяется команда sort.
Давайте начнём с того, что посчитаем общее количество строк в файле rockyou.txt. Для этого мы выведем его содержимое в стандартный вывод командой cat, а затем применим команду wc:
cat rockyou.txt | wc -l 14344391
Теперь перед тем, как посчитать количество строк, мы их отсортируем (команда sort) и удалим одинаковые (команда uniq). Обе эти команды умеют работать со стандартным вводом (а также и с файлами). Далее показан пример при работе со стандартным вводом:
cat rockyou.txt | sort | uniq | wc -l 14341564
Как можно заметить, в файле rockyou.txt имеется почти три тысячи абсолютно одинаковых строк.
Задание для самостоятельной работы: посмотрите справку по командам uniq, sort и wc и удалите дубликаты из файла rockyou.txt без использования стандартного ввода. А затем посчитайте количество уникальный записей также без использования стандартного ввода.
У команды uniq имется ключ -d, который позволяет просмотреть одинаковые строки. Но вначале очистим словарь от нечитаемых символов:
iconv -f utf-8 -t utf-8 -c ~/rockyou.txt > ~/rockyou_clean.txt
Подробности о проблеме, которую решает предыдущая команда, вы найдёте в статье «Как из текстового файла найти и удалить символы, отличные от UTF-8».
А теперь выведем список дублирующихся строк:
cat rockyou_clean.txt | sort | uniq -d
Искать полные слова
При поиске строки отобразит все строки, в которых строка встроена в строки большего размера.
Например, если вы ищете «gnu», все строки, в которых «gnu» встроено в слова большего размера, такие как «cygnus» или «magnum», будут найдены:
Чтобы вернуть только те строки, в которых указанная строка представляет собой целое слово (заключенное в символы, отличные от слов), используйте параметр (или ).
Символы слова включают буквенно-цифровые символы ( , и ) и символы подчеркивания ( ). Все остальные символы считаются несловесными символами.
Если вы запустите ту же команду, что и выше, включая параметр , команда вернет только те строки, где включен как отдельное слово.