Користење на Grep и редовни изрази за пребарување на шеми на текст во Linux
Вовед
Командата grep
е една од најкорисните команди во терминалната околина на Линукс. Името grep
значи \печатење на глобален регуларен израз. Ова значи дека можете да го користите grep
за да проверите дали влезот што го прима се совпаѓа со одредена шема. Оваа навидум тривијална програма е исклучително моќен; неговата способност да ги сортира влезовите врз основа на сложени правила го прави популарна алка во многу синџири на команди.
Во ова упатство, ќе ги истражите опциите на командата grep
, а потоа ќе се впуштите во користење на регуларни изрази за да направите понапредно пребарување.
Предуслови
За да го следите ова упатство, ќе ви треба пристап до компјутер со оперативен систем базиран на Линукс. Ова може да биде или виртуелен приватен сервер на кој сте се поврзале со SSH или со вашата локална машина. Забележете дека ова упатство беше потврдено со користење на сервер за Линукс со Ubuntu 20.04, но дадените примери треба да работат на компјутер што работи на која било верзија на која било дистрибуција на Линукс.
Ако планирате да користите далечински сервер за да го следите ова упатство, ве охрабруваме прво да го комплетирате нашето упатство за почетно поставување сервер. Со тоа ќе поставите безбедно опкружување на серверот - вклучувајќи корисник кој не еroot со привилегии sudo
и заштитен ѕид конфигуриран со UFW - што можете да го користите за да го изградите вашиот Linux вештини.
Основна употреба
Во ова упатство, ќе го користите grep
за да пребарувате во GNU General Public License верзија 3 за различни зборови и фрази.
Ако сте на Ubuntu систем, можете да ја најдете датотеката во папката /usr/share/common-licenses
. Копирајте го во вашиот домашен директориум:
- cp /usr/share/common-licenses/GPL-3 .
Ако сте на друг систем, користете ја командата curl
за да преземете копија:
- curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt
Исто така, ќе ја користите датотеката за лиценца BSD во ова упатство. На Linux, можете да го копирате во вашиот домашен директориум со следнава команда:
- cp /usr/share/common-licenses/BSD .
Ако сте на друг систем, креирајте ја датотеката со следнава команда:
- cat << 'EOF' > BSD
- Copyright (c) The Regents of the University of California.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- EOF
Сега кога ги имате датотеките, можете да започнете да работите со grep
.
Во најосновната форма, користите grep
за да одговарате на буквални обрасци во текстуална датотека. Ова значи дека ако поминете grep
збор за пребарување, тој ќе ја испечати секоја линија во датотеката што го содржи тој збор.
Извршете ја следнава команда за да користите grep
за да ја пребарувате секоја линија што го содржи зборот GNU
:
- grep "GNU" GPL-3
Првиот аргумент, GNU
, е шаблонот што го барате, додека вториот аргумент, GPL-3
, е влезната датотека што сакате да ја пребарувате.
Резултирачкиот излез ќе биде секоја линија што го содржи текстот на шемата:
Output GNU GENERAL PUBLIC LICENSE
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
Developers that use the GNU GPL protect your rights with two steps:
"This License" refers to version 3 of the GNU General Public License.
13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
...
...
На некои системи, шаблонот што го баравте ќе биде означен на излезот.
Заеднички опции
Стандардно, grep
ќе ја бара точно одредената шема во влезната датотека и ќе ги врати линиите што ги наоѓа. Може да го направите ова однесување покорисно со додавање на некои опционални знаменца во grep
.
Ако сакате grep
да го игнорира \буквите на параметарот за пребарување и да бара варијации и големи и мали букви, можете да го наведете -i
или --ignore-case
опција.
Пребарајте го секој примерок од зборот лиценца
(со горни, долни или мешани букви) во истата датотека како претходно со следнава команда:
- grep -i "license" GPL-3
Резултатите содржат: LICENSE
, лиценца
и Лиценца
:
Output GNU GENERAL PUBLIC LICENSE
of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for
The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
"This License" refers to version 3 of the GNU General Public License.
"The Program" refers to any copyrightable work licensed under this
...
...
Ако имаше пример со LiCeNsE
, и тој ќе беше вратен.
Ако сакате да ги најдете сите линии што не содржат одредена шема, можете да ја користите опцијата -v
или --invert-match
.
Пребарајте ја секоја линија што не го содржи зборот the
во лиценцата BSD со следнава команда:
- grep -v "the" BSD
Ќе го добиете овој излез:
OutputAll rights reserved.
Redistribution and use in source and binary forms, with or without
are met:
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Бидејќи не ја наведовте опцијата „игнорирај случај“, последните две ставки беа вратени како што го немаат зборот the
.
Често е корисно да се знае бројот на линијата на која се појавуваат совпаѓањата. Можете да го направите ова со користење на опцијата -n
или --line-number
. Повторете го претходниот пример со додадено ова знаме:
- grep -vn "the" BSD
Ова ќе го врати следниов текст:
Output2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13: may be used to endorse or promote products derived from this software
14: without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Сега можете да го повикате бројот на линијата ако сакате да направите промени на секоја линија што не содржи the
. Ова е особено корисно кога работите со изворниот код.
Редовни изрази
Во воведот, научивте дека grep
значи \печатење на глобален регуларен израз. \редовниот израз е текстуална низа што опишува одредена шема за пребарување.
Различни апликации и програмски јазици малку поинаку ги имплементираат регуларните изрази. Во ова упатство ќе истражувате само мало подмножество на начинот на кој grep
ги опишува неговите шеми.
Буквални натпревари
Во претходните примери во ова упатство, кога ги баравте зборовите GNU
и the
, всушност баравте основни правилни изрази што одговараат на точната низа знаци GNU
и the
. Шаблоните што точно ги специфицираат знаците што треба да се совпаднат се нарекуваат \буквални бидејќи буквално се совпаѓаат со шаблонот, карактер-за-лик.
Корисно е да се мисли дека тие се совпаѓаат со низа знаци наместо да одговараат на збор. Ова ќе стане поважна разлика додека учите посложени обрасци.
Сите азбучни и нумерички знаци (како и одредени други знаци) се совпаѓаат буквално, освен ако не се изменети со други механизми за изразување.
Натпревари за сидро
Сидрата се специјални знаци кои одредуваат каде во линијата мора да се појави совпаѓање за да биде валидно.
На пример, користејќи сидра, можете да наведете дека сакате да знаете само за линиите што се совпаѓаат со GNU
на самиот почеток на линијата. За да го направите ова, можете да го користите сидрото ^
пред буквалната низа.
Извршете ја следнава команда за да ја пребарувате датотеката GPL-3
и да пронајдете линии каде што GNU
се појавува на самиот почеток на линијата:
- grep "^GNU" GPL-3
Оваа команда ќе ги врати следните две линии:
OutputGNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published
Слично, го користите сидрото $
на крајот на шемата за да покажете дека совпаѓањето ќе биде валидно само ако се појави на самиот крај на линијата.
Оваа команда ќе одговара на секоја линија што завршува со зборот и
во датотеката GPL-3
:
- grep "and$" GPL-3
Ќе го добиете овој излез:
Outputthat there is no warranty for this free software. For both users' and
The precise terms and conditions for copying, distribution and
License. Each licensee is addressed as "you". "Licensees" and
receive it, in any medium, provided that you conspicuously and
alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and
Усогласување со кој било лик
Карактерот точка (.) се користи во регуларни изрази за да значи дека секој поединечен знак може да постои на одредената локација.
На пример, за да се совпадне што било во датотеката GPL-3
што има два знака, а потоа низата cept
, би ја користеле следнава шема:
- grep "..cept" GPL-3
Оваа команда го враќа следниот излез:
Outputuse, which is precisely where it is most unacceptable. Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
You may not propagate or modify a covered work except as expressly
9. Acceptance Not Required for Having Copies.
...
...
Овој излез има примери на прифати
и освен
и варијации на двата збора. Шемата, исто така, би се совпаднала со z2cept
доколку се најде и тоа.
Изрази на загради
Со поставување на група знаци во загради (\[
и \]
), можете да наведете дека знакот на таа позиција може да биде кој било знак што се наоѓа во групата загради.
На пример, за да ги пронајдете линиите што содржат too
или two
, би ги специфицирале тие варијации пократко со користење на следнава шема:
- grep "t[wo]o" GPL-3
Излезот покажува дека двете варијации постојат во датотеката:
Outputyour programs, too.
freedoms that you received. You must make sure that they, too, receive
Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
Corresponding Source from a network server at no charge.
...
...
Нотацијата на заградата ви дава неколку интересни опции. Може да направите шаблонот да се совпаѓа со сè освен знаците во заградата со тоа што ќе ја започнете листата на знаци во заградите со знак ^.
Овој пример е како шаблонот .ode
, но нема да одговара на шаблонот code
:
- grep "[^c]ode" GPL-3
Еве го излезот што ќе го добиете:
Output 1. Source Code.
model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:
Забележете дека во втората вратена линија, всушност, постои зборот code
. Ова не е неуспех на регуларниот израз или grep. Наместо тоа, оваа линија беше вратена затоа што претходно во линијата, беше пронајдена шемата mode
, пронајдена во зборот model
. Линијата беше вратена затоа што имаше пример што одговараше на шемата.
Друга корисна карактеристика на заградите е тоа што можете да наведете опсег на знаци наместо поединечно да го пишувате секој достапен знак.
Ова значи дека ако сакате да ја пронајдете секоја линија што започнува со голема буква, можете да ја користите следнава шема:
- grep "^[A-Z]" GPL-3
Еве го излезот што го враќа овој израз:
OutputGNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
...
...
Поради некои проблеми со сортирањето на наследството, често е попрецизно да се користат класи на знаци POSIX наместо опсези на знаци како што сте користеле.
Да се дискутира за секоја класа на знаци POSIX би било надвор од опсегот на ова упатство, но примерот што ќе ја постигне истата постапка како претходниот пример ја користи класата на знаци \[:upper:\]
во избирачот за загради :
- grep "^[[:upper:]]" GPL-3
Излезот ќе биде ист како порано.
Повторете ја шемата нула или повеќе пати
Конечно, еден од најчесто користените мета-знаци е ѕвездичката или *
, што значи „повторете го претходниот знак или израз нула или повеќе пати“.
За да ја пронајдете секоја линија во датотеката GPL-3
што содржи заграда за отворање и затворање, со само букви и единечни празни места помеѓу, користете го следниов израз:
- grep "([A-Za-z ]*)" GPL-3
Ќе го добиете следниот излез:
Output Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
(including a physical distribution medium), accompanied by the
(including a physical distribution medium), accompanied by a
place (gratis or for a charge), and offer equivalent access to the
...
...
Досега сте користеле точки, ѕвездички и други знаци во вашите изрази, но понекогаш треба конкретно да ги пребарувате тие знаци.
Бегство од мета-ликови
Има моменти кога ќе треба да пребарувате за буквален период или буквална заграда за отворање, особено кога работите со изворниот код или конфигурациските датотеки. Бидејќи овие знаци имаат посебно значење во регуларните изрази, треба да „избегате“ од овие знаци за да му кажете на grep
дека не сакате да го користите нивното посебно значење во овој случај.
Избегнувате знаци со користење на знакот за обратна коса црта (\
) пред знакот што вообичаено би имал посебно значење.
На пример, за да пронајдете која било линија што започнува со голема буква и завршува со точка, користете го следниов израз кој го избегнува завршниот период, така што претставува буквален период наместо вообичаеното „било кој знак“ што значи:
- grep "^[A-Z].*\.$" GPL-3
Ова е излезот што ќе го видите:
OutputSource.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.
Сега да ги погледнеме другите опции за редовни изрази.
Проширени регуларни изрази
Командата grep
поддржува поопширен јазик на правилен израз со користење на знамето -E
или со повикување на командата egrep
наместо grep
.
Овие опции ги отвораат можностите на \проширени регуларни изрази. Проширените регуларни изрази ги вклучуваат сите основни мета-знаци, заедно со дополнителни мета-знаци за изразување посложени совпаѓања.
Групирање
Една од најкорисните способности што ја отвораат проширените редовни изрази е способноста да се групираат изразите заедно за да се манипулира или да се реферира како една единица.
За да групирате изрази заедно, завиткајте ги во загради. Ако сакате да користите загради без да користите продолжени регуларни изрази, можете да ги избегнете со обратна коса црта за да ја овозможите оваа функционалност. Ова значи дека следните три изрази се функционално еквивалентни:
- grep "\(grouping\)" file.txt
- grep -E "(grouping)" file.txt
- egrep "(grouping)" file.txt
Алтернација
Слично на тоа како изразите на заградите можат да наведат различни можни избори за совпаѓање со еден знак, алтернацијата ви овозможува да наведете алтернативни совпаѓања за низи или множества изрази.
За да покажете алтернација, користете го знакот на цевката |
. Тие често се користат во групирање во заграда за да се специфицира дека една од двете или повеќе можности треба да се смета за совпаѓање.
Следното ќе најде или GPL
или Општа јавна лиценца
во текстот:
- grep -E "(GPL|General Public License)" GPL-3
Излезот изгледа вака:
Output The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
Developers that use the GNU GPL protect your rights with two steps:
For the developers' and authors' protection, the GPL clearly explains
authors' sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
...
...
Алтернацијата може да избира помеѓу повеќе од два избора со додавање дополнителни избори во групата за одбирање одделени со дополнителни знаци на цевка (|
).
Квантификатори
Како и мета-знакот *
што се совпаѓаше со претходниот знак или множество знаци нула или повеќе пати, има и други мета-знаци достапни во проширени регуларни изрази кои го одредуваат бројот на појавувања.
За да поклопите знак нула или еден пати, можете да го користите знакот ?
. Ова во суштина ги прави опционални множества на карактери или знаци кои дојдоа претходно.
Следниве се совпаѓаат со авторските права
и правото
со ставање на copy
во изборна група:
- grep -E "(copy)?right" GPL-3
Ќе го добиете овој излез:
Output Copyright (C) 2007 Free Software Foundation, Inc.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
"Copyright" also means copyright-like laws that apply to other kinds of
...
Карактерот +
се совпаѓа со израз еднаш или повеќе пати. Ова е речиси како мета-знакот *
, но со знакот +
, изразот мора да се совпадне барем еднаш.
Следниот израз се совпаѓа со низата free
плус еден или повеќе знаци кои не се знаци со празно место:
- grep -E "free[^[:space:]]+" GPL-3
Ќе го видите овој излез:
Output The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedomss that you received. You must make sure that they, too, receive
protecting users' freedom to change the software. The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.
Одредување на повторување на натпреварот
За да одредите колку пати се повторува совпаѓањето, користете ги знаците за загради ({
и }
). Овие знаци ви дозволуваат да наведете точен број, опсег или горните или долните граници на бројот на пати што може да се совпадне изразот.
Користете го следниов израз за да ги најдете сите линии во датотеката GPL-3
што содржат тројни самогласки:
- grep -E "[AEIOUaeiou]{3}" GPL-3
Секој вратен ред има збор со три самогласки:
Outputchanged, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this
За да се совпаднат зборовите што имаат помеѓу 16 и 20 знаци, користете го следниов израз:
- grep -E "[[:alpha:]]{16,20}" GPL-3
Еве го излезот од оваа команда:
Output certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
c) Prohibiting misrepresentation of the origin of that material, or
Се прикажуваат само линиите што содржат зборови во таа должина.
Заклучок
grep
е корисен за пронаоѓање шеми во датотеките или во хиерархијата на датотечниот систем, па затоа вреди да се потроши време за да се чувствувате удобно со неговите опции и синтакса.
Редовните изрази се уште поразновидни и можат да се користат со многу популарни програми. На пример, многу текстуални уредувачи имплементираат регуларни изрази за пребарување и замена на текст.
Понатаму, повеќето современи програмски јазици користат редовни изрази за извршување на процедури на одредени податоци. Откако ќе ги разберете редовните изрази, ќе можете да го пренесете тоа знаење на многу вообичаени задачи поврзани со компјутерот, од извршување на напредни пребарувања во вашиот уредувач на текст до потврдување на внесувањето на корисникот.