По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Команда find - невероятно мощный инструмент, и умение управлять им может быть полезным и облегчить работу в системе Linux. Она поможет эффективно выполнять различные задачи системного администрирования, такие как управление дисковым пространством, рекурсивные операции с файлами и резервное копирование. Команда Find Linux выполняет поиск файлов и папок по заданным критериям и позволяет выполнять действия с результатами поиска. Синтаксис поиска таков: $ find directory-to-search criteria action где: directory-to-search - это начальная точка, с которой утилита начинает поиск файлов. Поиск включает все подкаталоги в этом каталоге criteria (test) - указывает, какие файлы искать action - указывает, что делать с каждым найденным файлом, соответствующим критериям Критерии Поиск по имени Вот простой пример. Следующая команда выполняет поиск файла a.txt в текущем каталоге: $ find . -name "a.txt" ./a.txt Где: . - ссылается на текущий каталог -name – определяет критерии для сопоставления По умолчанию, ключевое слово -name чувствительно к регистру и игнорирует файл A.txt. Чтобы убедиться, что поиск не учитывает регистр, используйте -iname: $ find . -iname "a.txt" ./a.txt ./A.txt Для поиска всех файлов изображений .jpg в текущем каталоге используйте шаблон подстановочных знаков * .jpg: $ find . -name "*.jpg" ./genxfacebook2.jpg ./genxfacebook1.jpg ./Moodle2.jpg ./moodle.jpg ./moodle/moodle1.jpg ./genxfacebook.jpg Можно использовать имя каталога для поиска. Например, для поиска всех изображений .jpg в каталоге /home: $ find /home -name "*.jpg" find: `/home/ubuntu/.ssh': Permission denied /home/vagrant/Moodle2.jpg /home/vagrant/moodle.jpg /home/me/hello.jpg find: `/home/me/testfiles': Permission denied find: `/home/me/data': Permission denied /home/me/water.jpg find: `/home/me/.cache': Permission denied При наличии слишком большого количества сообщений об отказе в доступе в конце команды можно добавить 2 >/dev/null. Это перенаправляет сообщения об ошибках на устройство /dev/null и выдает чистые выходные данные: find /home -name "*.jpg" 2>/dev/null /home/vagrant/Moodle2.jpg /home/vagrant/moodle.jpg /home/me/hello.jpg /home/me/water.jpg Поиск по типу файла С помощью ключевого слова -type можно искать файлы по типу. Типы файлов могут быть: f plain files d directories l symbolic links b block devices c character devices p named pipes s sockets Например, при использовании параметра -type d будут перечислены только каталоги: $ find . -type d . ./.ssh ./.cache ./moodle Поиск по размеру файла Возможно, потребуется выполнить поиск больших файлов и удалить их. В следующем примере за после ключевого слова -size следует строка 1G. Это приведет к поиску всех файлов размером более 1 ГБ. $ find . -size +1G ./Microsoft_Office_16.29.19090802_Installer.pkg ./android-studio-ide-183.5692245-mac.dmg Знак + означает, что нужно искать файлы, размер которых больше указанного числа. Символ минус - может использоваться для обозначения меньшего значения, чем указано. Использование без знака означало бы точное совпадение размера. За номером следует единица измерения размера файла. Единицами измерения могут быть: b - Блоки по 512 байтов c - Байты k - Килобайты M - Мегабайты G - Гигабайты Поиск пустых каталогов и файлов Используйте параметр -empty для поиска пустых каталогов и файлов: $ find . -empty ./.cloud-locale-test.skip ./datafiles ./b.txt ... ./.cache/motd.legal-displayed Поиск по времени изменения файла С помощью ключевого слова -cmin можно выполнять поиск всех файлов и каталогов по времени создания или изменения. Для поиска всех файлов, измененных за последние 60 минут (менее 60), используйте -60 следующим образом: $ find . -cmin -60 . ./a.txt ./datafiles Для файлов, измененных в любое время до последних 60 минут, используйте 60. Поиск по времени доступа Поиск файлов можно выполнить по времени последнего доступа с помощью ключевого слова -atime. Например, следующая команда выполняет поиск файлов, доступ к которым не осуществлялся за последние 180 дней: $ find . -atime +180 Их можно переместить на устройство резервного копирования, если недостаточно места на диске. Поиск по имени пользователя С помощью параметра -user username можно искать все файлы и каталоги, принадлежащие конкретному пользователю. Например, следующая команда выполняет поиск всех файлов и каталогов, принадлежащих пользователю ubuntu в каталоге /home: $ find /home -user ubuntu 2>/dev/null /home/ubuntu /home/ubuntu/.bash_logout /home/ubuntu/.bashrc /home/ubuntu/.ssh /home/ubuntu/.profile Поиск по режиму доступа Хотите найти файлы с определенным режимом доступа, то есть имеющие определенный набор разрешений? Используйте ключевого слова -perm. В следующем примере выполняется поиск файлов с разрешениями 777: $ find /home -perm 777 Операторы Для объединения нескольких ключевых слов в одной команде можно использовать следующие три логических оператора: -and -or -not Например, следующая команда выполняет поиск файлов, превышающих 100MB, которыми владеет указанный пользователь: $ find /home -user me -and -size +100M 2>/dev/null /home/me/kali-linux-2020.3-installer-netinst-i386.iso Следующая команда ищет файлы, размер которых превышает 100MB, принадлежащие пользователю me или пользователю vagrant: $ find /home ( -user vagrant -or -user me ) -and -size +100M 2>/dev/null /home/vagrant/LibreOffice_7.0.1_Linux_x86-64_deb.tar.gz /home/me/kali-linux-2020.3-installer-netinst-i386.iso Необходимо поместить символ обратной косой черты перед скобками, чтобы предотвратить попытку их интерпретации оболочкой. Действия Утилита find предоставляет результаты поиска, а затем выбор для выполнения действия над ними. Ниже приведены некоторые предопределенные действия. -delete - Удаление файлов, соответствующих критериям поиска -ls - Отображение подробных выходных данных ls с размерами файлов и количеством входов -print - Показывает полный путь к соответствующим файлам. Это действие по умолчанию, если не указано другое действие -exec - Выполняет следующую команду в каждой строке результатов поиска Итак, если вы хотите найти все пустые файлы и удалить их, вы можете сделать это следующим образом: $ find . -empty -delete Внимание! Перед использованием действия удаления всегда безопасно выполнить команду один раз с действием -print и подтвердить результаты. Действие -exec является особым. Он позволяет выполнить выбранную команду в результатах поиска. Это так: -exec command {} ; Здесь command – команда, которую требуется выполнить в результатах поиска, например, rm, mv или cp. {} – представляет результаты поиска. Команда заканчивается точкой с запятой с обратной косой чертой. Таким образом, команда поиска и удаления всех пустых файлов может быть написана следующим образом: $ find . -empty -exec rm {} ; Вот еще один пример использования действия -exec. Следующая команда копирует все PNG-файлы образов в каталог backup/images: $ find . -name "*.png" -exec cp {} /backups/images ; Заключение Команда find используется для поиска файлов по имени, дате последнего доступа, дате последнего изменения, имени пользователя (владельца), имени группы, размеру, разрешениям и другим различным критериям. Эти результаты поиска позволяют выполнять с ними такие действия, как удаление, копирование или перемещение в другое расположение. После того, как вы освоите команду find, она может помочь вам и упростить задачи системного администрирования. И ключ к его освоению - это его практика и использование!
img
Сегментная маршрутизация (Segment Routing, SR) может или не может считаться туннельным решением, в зависимости от конкретной реализации и того, насколько строго вы хотите придерживаться определения туннелей, представленного ранее в статье "Виртуализация сетей". В этой статье будет рассмотрена основная концепция сегментной маршрутизации и две возможные схемы реализации: одна с использованием меток потока IPv6, а другая с использованием меток многопротокольной коммутации по меткам (Multiprotocol Label Switching -MPLS). Каждому устройству в сети с поддержкой SR присваивается уникальная метка. Стек меток, описывающий путь в терминах этих уникальных меток, может быть присоединен к любому пакету, заставляя его принимать определенный указанный путь. Рисунок 5 демонстрирует это. Каждый маршрутизатор на рисунке 5 объявляет IP-адрес в качестве идентификатора вместе с меткой, прикрепленной к этому IP-адресу. В SR метка, прикрепленная к идентификатору маршрутизатора, называется идентификатором сегмента узла (SID узла). Поскольку каждому маршрутизатору в сети присваивается уникальная метка, путь через сеть может быть описан с использованием только этих меток. Например: Если вы хотите перенаправить трафик от A к K по пути [B, E, F, H], вы можете описать этот путь с помощью меток [101,104,105,107]. Если вы хотите перенаправить трафик от A к K по пути [B, D, G, H], вы можете описать этот путь с помощью меток [101,103,106,107]. Набор меток, используемых для описания пути, называется стеком меток. Между D и H есть две связи; как это можно описать? В SR доступно несколько опций, в том числе: Стек меток может включать в себя только идентификаторы SID узла, описывающие путь через сеть в терминах маршрутизаторов, как показано ранее. В этом случае, если бы стек меток включал пару [103,107], D просто перенаправлял бы H в обычном режиме на основе информации локальной маршрутизации, поэтому он будет использовать любой локальный процесс, который он будет использовать для пересылки любого другого пакета, например, распределение нагрузки между двумя каналами для пересылки трафика с меткой SR. Стек меток может включать явную метку для загрузки общего ресурса по любому доступному набору путей, доступных в этой точке сети. H может назначить метку для каждого входящего интерфейса, а также SID узла, привязанный к его локальному идентификатору маршрутизатора. Эти метки будут объявляться так же, как SID узла, но, поскольку они описывают смежность, они называются SID смежности (adjacency). SID смежности уникален локально; он уникален для маршрутизатора, объявляющего сам SID смежности. Третий вид SID, префиксный SID, описывает конкретный достижимый пункт назначения (префикс) в сети. SID узла может быть реализован как SID префикса, привязанный к loopback адресу на каждом маршрутизаторе в сети. Не обязательно, чтобы весь путь описывался стеком меток. Например, стек меток [101,103] будет направлять трафик в B, затем в D, но затем позволит D использовать любой доступный путь для достижения IP-адреса назначения в K. Стек меток [105] обеспечит прохождение трафика через сеть к K будет проходить через F. Не имеет значения, как трафик достиг этой точки в сети и как он был перенаправлен после того, как достигнет F, если он проходит через F, будучи направленным к K. Каждая метка в стеке представляет собой сегмент. Пакеты переносятся от метки к метке через каждый сегмент в сети, чтобы быть транспортированными от головной части пути к хвостовой части пути. Маршрутизация сегментов с многопротокольной коммутацией меток MPLS был изобретен как способ сочетать преимущества асинхронного режима передачи (ATM), который больше не используется широко, с IP-коммутацией. В первые дни сетевой инженерии наборы микросхем, используемые для коммутации пакетов, были более ограничены в своих возможностях, чем сейчас. Многие из используемых наборов микросхем были Field Programmable Gate Arrays (FPGA), а не Application-Specific Integrated Circuits (ASIC), поэтому длина поля, в котором коммутировался пакет, напрямую коррелировала со скоростью, с которой пакет мог коммутироваться. Часто было проще переработать пакет или обработать его дважды, чем включать в заголовок много сложной информации, чтобы пакет можно было обработать один раз. Примечание: повторное использование пакетов по-прежнему часто используется во многих наборах микросхем для поддержки внутренних и внешних заголовков или даже для обработки различных частей более длинного и сложного заголовка пакета. MPLS инкапсулирует исходный пакет в заголовок MPLS, который затем используется для коммутации пакета по сети. На рисунке 6 показан заголовок MPLS. Весь заголовок состоит из 32 бит, метка 20 бит. Устройство пересылки MPLS может выполнять три операции: Текущая метка в заголовке MPLS может быть заменена другой меткой (SWAP). В пакет можно вставить новую метку (PUSH). Текущая метка может быть очищена, а метка под текущей меткой обработана (POP). Операции PUSH и POP переносятся непосредственно в SR: операция SWAP реализована в SR как CONTINUE, что означает, что текущая метка заменяется той же меткой (т. е. заголовок с меткой 100 будет заменен меткой 100), и обработка этого текущего сегмента будет продолжена. Проще всего понять процесс обработки на примере. Рисунок 7 демонстрирует это. На рисунке 7 каждому маршрутизатору присвоена глобально уникальная метка из глобального блока сегментной маршрутизации (Segment Routing Global Block -SRGB). Они объявляются через протокол маршрутизации или другую плоскость управления. Когда A получает пакет, предназначенный для N, он выбирает путь через сеть, используя некоторый локальный механизм. В этот момент: Чтобы начать процесс, A выполнит PUSH серии заголовков MPLS на пакете, которые описывают путь через сеть, [101,103,104,202,105,106,109, 110]. Когда A коммутирует пакет в сторону B, он вставит первую метку в стек, так как нет необходимости отправлять свою собственную метку в заголовке. Стек меток на канале [A,B] будет равен [103,104,202,105,106,109,110]. Когда B получает пакет, он проверяет следующую метку в стеке. Обнаружив, что метка равна 103, он выполнит POP этой метки и перешлет пакет в D. В этом случае стек меток SR выбрал один из двух возможных путей с равной стоимостью через сеть, так что это пример выбора SR конкретного пути. Стек меток на канале [B, D] будет [104,202,105,106,109,110]. Когда D получает пакет, верхняя метка в стеке будет 104. D выполнит POP этой метки и отправит пакет в E. Стек меток на канале [D, E] будет [202,105,106,109,110]. Когда E получает этот пакет, верхняя метка в стеке - 202. Это селектор смежности, поэтому он выбирает конкретный интерфейс, а не конкретного соседа. E выберет правильный интерфейс, нижний из двух интерфейсов на рисунке, и POP этой метки. Верхняя метка теперь представляет собой SID узла для F, который можно удалить, поскольку пакет передается на F. E переработает пакет и также откроет эту POP. Стек меток на канале [E, F] будет [106,109,110]. Когда пакет достигает F, следующей меткой в стеке будет 106. Эта метка указывает, что пакет должен быть передан в G. F выполнит POP метки и передаст ее G. Стек меток на канале [F, G] будет [109,110]. Когда пакет достигает G, следующая метка в стеке - 109, что указывает на то, что пакет должен быть направлен к L. Поскольку G не соединен напрямую с L, он может использовать локальный, свободный от петель (обычно самый короткий) путь к L. В этом случае есть два пути с равной стоимостью к L, поэтому G выполнит POP метки 109 и переадресовывает по одному из этих двух путей к L. В сегменте [G, L] стек меток равен [110]. Предположим, что G решает отправить пакет через K. Когда K получает пакет, он будет иметь стек меток, содержащий [110], который не является ни локальной меткой, ни смежным узлом. В этом случае метка должна оставаться прежней, или сегмент должен иметь CONTINUE. Чтобы реализовать это, K поменяет текущую метку 110 на другую копию той же метки, так что K будет пересылать трафик с той же меткой. На канале [K,L] стек меток будет равен [110]. Когда L принимает пакет, единственной оставшейся меткой будет 110, что указывает на то, что пакет должен быть направлен в M. L будет выполнена POP метки 109, эффективно удалив всю инкапсуляцию MPLS, и перенаправит пакет в M. Когда M получает пакет, он пересылает его, используя обычный IP-адрес, в конечный пункт назначения - N. Концепция стека меток в MPLS реализована в виде серии заголовков MPLS, уложенных друг на друга. Pop метки означает удаление самой верхней метки, push метки означает добавление нового заголовка MPLS в пакет, а continue означает замену метки идентичной меткой. Когда вы работаете со стопкой меток, понятия внутреннего и внешнего часто сбивают с толку, особенно, поскольку многие люди используют идею метки и заголовка как взаимозаменяемые. Возможно, лучший способ уменьшить путаницу - использовать термин "заголовок" для обозначения всего стека меток и исходного заголовка, переносимого внутри MPLS, при этом обращаясь к меткам как к отдельным меткам в стеке. Тогда внутренний заголовок будет исходным заголовком пакета, а внешний заголовок будет стеком меток. Внутренняя метка будет следующей меткой в стеке в любой момент прохождения пакета по сети, а внешняя метка будет меткой, по которой пакет фактически переключается. Хотя в приведенном здесь примере используются IP-пакеты внутри MPLS, протокол MPLS предназначен для передачи практически любого протокола, включая Ethernet. Таким образом, SR MPLS не ограничивается использованием для передачи одного типа трафика, но может также использоваться для передачи кадров Ethernet по сети на основе IP / MPLS. Это означает, что SR можно использовать для поддержки первого варианта использования, обсуждаемого в этой статье, - предоставления услуг Ethernet по IP-сети. MPLS - это туннель? Много написанных и произнесенных слов были пролиты на вопрос о том, является ли MPLS протоколом туннелирования. Здесь туннелирование определяется как действие, а не протокол; это намеренная попытка отделить идею протокола туннелирования от концепции туннелирования как действия, предпринимаемого при передаче трафика через сеть. В случае MPLS это означает, что он может быть, а может и не быть протоколом туннелирования, в зависимости от того, как он используется - как и любой другой протокол. Например, если у вас есть стек меток, помещенных поверх пакета с IP-заголовком, внешняя метка, на которую коммутируется пакет, не является (технически) туннелем. Этот внешний заголовок в сети MPLS фактически является локальным для сегмента, поэтому он либо выталкивается, либо отправляется на каждом маршрутизаторе. Это аналогично заголовку Ethernet для каждого канала. Однако внутренний заголовок переносится в пакете MPLS и, следовательно, технически туннелируется. Внутренняя метка не используется на текущем устройстве для коммутации пакета; он просто переносится как часть пакета. Это определение не идеально. Например, в случае MPLS SWAP или SR CONTINUE, используется ли метка для коммутации пакета или нет? Кроме того, в отличие от заголовка Ethernet в пакете, заголовок MPLS фактически используется при принятии решения о пересылке. Заголовок Ethernet, напротив, просто используется для достижения следующего перехода, а затем отбрасывается. Возможно, более подходящим сравнением было бы следующее: Заголовок MPLS подобен заголовку Ethernet, который используется для достижения перехода за пределы устройства, на которое маршрутизатор в настоящее время передает. Независимо от этих ограничений, этого определения обычно достаточно, чтобы мысленно управлять различием между туннелированием и не туннелированием в MPLS, а также в большинстве других протоколов.
img
Изначально разработанный для Unix-систем grep, является одной из наиболее широко используемых утилит командной строки в среде Linux. grep расшифровывается как "глобальный поиск строк, соответствующих регулярному выражению и их вывод" (globally search for a regular expression and print matching lines). grep в основном ищет на основе указанного посредством стандартного ввода или файла шаблона, или регулярного выражения и печатает строки, соответствующие заданным критериям. Часто используется для фильтрации ненужных деталей при печати только необходимой информации из больших файлов журнала. Это возможно благодаря совместной работе регулярных выражений и поддерживаемых grep параметров. Здесь мы рассмотрим некоторые из часто используемых сисадминами или разработчиками команд grep в различных сценариях. Синтаксис grep Команда grep принимает шаблон и необязательные аргументы вместе со перечислять файлов, если используется без трубопровода. $ grep [options] pattern [files] Простой пример: $ grep my file.txt my_file 1. Поиск среди нескольких файлов grep позволяет выполнять поиск заданного шаблона не только в одном, но и среди нескольких файлах. Для этого можно использовать подстановочный символ *. $ sudo grep -i err /var/log/messages Как видно из вывода, утилита перед результатом искомого шаблона выводит также название файла, что позволяет определить где именно было найдено совпадение. 2. Регистронезависимый поиск grep позволяет искать шаблон без учета регистра. Чтобы указать grep игнорировать регистр используется флаг –i. $ grep -i [pattern] [file] 3. Поиск слова Иногда появляется необходимость поиска не части, а целого слова. В таких случаях утилита запускается с флагом -w. $ grep -w [pattern] [file] 4. Вывод количества совпадений Не всегда нужно выводить результат совпадения. Иногда достаточно только количества совпадений с заданным шаблоном. Эту информацию мы можем получить с помощью параметра -c. $ grep -c [pattern] [file] 5. Поиск в поддиректориях Часто необходимо искать файлы не только в текущей директории, но и в подкаталогах. grep позволяет легко сделать это с флагом -r. $ grep -r [pattern] * 6. Инверсивный поиск Если вы хотите найти что-то, что не соответствует заданному шаблону, grep позволяет сделать только это с флагом -v. $ grep -v [pattern] [file] Можно сравнить выходные резултаты grep для одного и того же шаблона и файла с флагом -v и без него. С параметром -v выводятся любые строки, которые не соответствуют образцу. 7. Вывод нумерации строк grep позволяет нумеровать совпавшие строки, что позволяет легко определить, где строка находится в файле. Чтобы получить номера строк в выходных данных. используйте параметр –n: $ grep -n [pattern] [file] 8. Ограничение вывода Результат вывода grep для файлов вроде журналов событий и т.д. может быть длинным, и вам может просто понадобиться фиксированное количество строк. Мы можем использовать -m [num], чтобы ограничить выводимые строки. $ grep -m[num] [pattern] [file] Обратите внимание, как использование флага -m влияет на вывод grep для одного и того же набора условий в примере ниже: 9. Вывод дополнительных строк Часто нам нужны не только строки, которые совпали с шаблоном, но некоторые строки выше или ниже их для понимания контекста. С помощью флагов -A, -B или -C со значением num можно выводить строки выше или ниже (или и то, и другое) совпавшей строки. Здесь число обозначает количество дополнительных печатаемых строк, которое находится чуть выше или ниже соответствующей строки. Это применимо ко всем совпадениям, найденным grep в указанном файле или списке файлов. $ grep -A[num] [pattern] [file] $ grep -B[num] [pattern] [file] $ grep -C[num] [pattern] [file] Ниже показан обычный вывод grep, а также вывод с флагом -A, -B и -C один за другим. Обратите внимание, как grep интерпретирует флаги и их значения, а также изменения в соответствующих выходных данных. С флагом -A1 grep печатает 1 строку, которая следует сразу после соответствующей строки. Аналогично, с флагом -B1 он печатает 1 строку непосредственно перед соответствующей строкой. С флагом -C1 он печатает 1 строку, которая находится до и после соответствующей строки. 10. Вывод списка файлов Чтобы напечатать только имя файлов, в которых найден образец, а не сами совпадающие строки, используйте флаг -l. $ grep -l [pattern] [file] 11. Вывод абсолютных совпадений Иногда нам нужно печатать строки, которые точно соответствуют заданному образцу, а не какой-то его части. Флаг -x grep позволяет делать именно это. $ grep -x [pattern] [file] В приведенном ниже примере файл file.txt содержит строку только с одним словом «support», что соответствует требованию grep с флагом –x. При этом игнорируются строки, которые могут содержать слова «support» с сопутствующим текстом. 12. Поиск совпадения в начале строки С помощью регулярных выражений можно найти последовательность в начале строки. Вот как это сделать. Обратите внимание, как с помощью символ каретки ^ изменяет выходные данные. Символ каретки указывает grep выводить результат, только если искомое слово находится в начале строки. Если в шаблоне есть пробелы, то можно заключить весь образец в кавычки. 13. Поиск совпадения в конце строки Другим распространенным регулярным выражением является поиск шаблона в конце строки. $ grep [options] "[string]$" [file] В данном примере мы искали точку в конце строки. Поскольку точка . является значимым символом, нужно её экранировать, чтобы среда интерпретировала точку как команду. Обратите внимание, как изменяется вывод, когда мы просто ищем совпадения . и когда мы используем $ для указания grep искать только те строки, которые заканчиваются на . (не те, которые могут содержать его где-либо между ними). 14. Использования файла шаблонов Могут возникнуть ситуации, когда у вас есть сложный список шаблонов, которые вы часто используете. Вместо записи его каждый раз можно указать список этих образцов в файле и использовать с флагом -f. Файл должен содержать по одному образцу на каждой строке. $ grep -f [pattern_file] [file_to_match] В нашем примере мы создали файла шаблона с названием pattern.txt со следующим содержимым: Для его использования используйте флаг -f. 15. Поиск по нескольким шаблонам grep позволяет задать несколько шаблонов с помощью флага -e. $ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file] 16. Указание расширенных регулярных выражений grep также поддерживает расширенные регулярные выражения (Extended Regular Expressions – ERE) или с использованием флага -E. Это похоже на команду egrep в Linux. Использование ERE имеет преимущество, когда вы хотите рассматривать метасимволы как есть и не хотите экранировать их. При этом использование -E с grep эквивалентно команде egrep. $ grep -E '[Extended RegEx]' [file] Ниже приведён пример использование ERE, для вывода не пустых и не закомментированных строк. Это особенно полезно для поиска чего-то в больших конфигурационных файлах. Здесь дополнительно использован флаг –v, чтобы НЕ выводить строки, соответствующих шаблону '^ (# | $)'. Заключение Приведенные выше примеры являются лишь верхушкой айсберга. grep поддерживает ряд вариантов и может быть очень полезным инструментом в руке человека, который знает, как его эффективно использовать. Мы можем не только использовать приведенные выше примеры, но и комбинировать их различными способами, чтобы получить то, что нам нужно. Для получения дополнительной информации можно воспользоваться встроенной системой справки Linux – man.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59