Користење на 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. Копирајте го во вашиот домашен директориум:

  1. cp /usr/share/common-licenses/GPL-3 .

Ако сте на друг систем, користете ја командата curl за да преземете копија:

  1. curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt

Исто така, ќе ја користите датотеката за лиценца BSD во ова упатство. На Linux, можете да го копирате во вашиот домашен директориум со следнава команда:

  1. cp /usr/share/common-licenses/BSD .

Ако сте на друг систем, креирајте ја датотеката со следнава команда:

  1. cat << 'EOF' > BSD
  2. Copyright (c) The Regents of the University of California.
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions
  6. are met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in the
  11. documentation and/or other materials provided with the distribution.
  12. 3. Neither the name of the University nor the names of its contributors
  13. may be used to endorse or promote products derived from this software
  14. without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  16. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  19. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. SUCH DAMAGE.
  26. EOF

Сега кога ги имате датотеките, можете да започнете да работите со grep.

Во најосновната форма, користите grep за да одговарате на буквални обрасци во текстуална датотека. Ова значи дека ако поминете grep збор за пребарување, тој ќе ја испечати секоја линија во датотеката што го содржи тој збор.

Извршете ја следнава команда за да користите grep за да ја пребарувате секоја линија што го содржи зборот GNU:

  1. 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 опција.

Пребарајте го секој примерок од зборот лиценца (со горни, долни или мешани букви) во истата датотека како претходно со следнава команда:

  1. 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 со следнава команда:

  1. grep -v "the" BSD

Ќе го добиете овој излез:

Output
All 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. Повторете го претходниот пример со додадено ова знаме:

  1. grep -vn "the" BSD

Ова ќе го врати следниов текст:

Output
2: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 се појавува на самиот почеток на линијата:

  1. grep "^GNU" GPL-3

Оваа команда ќе ги врати следните две линии:

Output
GNU 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:

  1. grep "and$" GPL-3

Ќе го добиете овој излез:

Output
that 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, би ја користеле следнава шема:

  1. grep "..cept" GPL-3

Оваа команда го враќа следниот излез:

Output
use, 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, би ги специфицирале тие варијации пократко со користење на следнава шема:

  1. grep "t[wo]o" GPL-3

Излезот покажува дека двете варијации постојат во датотеката:

Output
your 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:

  1. 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. Линијата беше вратена затоа што имаше пример што одговараше на шемата.

Друга корисна карактеристика на заградите е тоа што можете да наведете опсег на знаци наместо поединечно да го пишувате секој достапен знак.

Ова значи дека ако сакате да ја пронајдете секоја линија што започнува со голема буква, можете да ја користите следнава шема:

  1. grep "^[A-Z]" GPL-3

Еве го излезот што го враќа овој израз:

Output
GNU 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:\] во избирачот за загради :

  1. grep "^[[:upper:]]" GPL-3

Излезот ќе биде ист како порано.

Повторете ја шемата нула или повеќе пати

Конечно, еден од најчесто користените мета-знаци е ѕвездичката или *, што значи „повторете го претходниот знак или израз нула или повеќе пати“.

За да ја пронајдете секоја линија во датотеката GPL-3 што содржи заграда за отворање и затворање, со само букви и единечни празни места помеѓу, користете го следниов израз:

  1. 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 дека не сакате да го користите нивното посебно значење во овој случај.

Избегнувате знаци со користење на знакот за обратна коса црта (\) пред знакот што вообичаено би имал посебно значење.

На пример, за да пронајдете која било линија што започнува со голема буква и завршува со точка, користете го следниов израз кој го избегнува завршниот период, така што претставува буквален период наместо вообичаеното „било кој знак“ што значи:

  1. grep "^[A-Z].*\.$" GPL-3

Ова е излезот што ќе го видите:

Output
Source. 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.

Овие опции ги отвораат можностите на \проширени регуларни изрази. Проширените регуларни изрази ги вклучуваат сите основни мета-знаци, заедно со дополнителни мета-знаци за изразување посложени совпаѓања.

Групирање

Една од најкорисните способности што ја отвораат проширените редовни изрази е способноста да се групираат изразите заедно за да се манипулира или да се реферира како една единица.

За да групирате изрази заедно, завиткајте ги во загради. Ако сакате да користите загради без да користите продолжени регуларни изрази, можете да ги избегнете со обратна коса црта за да ја овозможите оваа функционалност. Ова значи дека следните три изрази се функционално еквивалентни:

  1. grep "\(grouping\)" file.txt
  2. grep -E "(grouping)" file.txt
  3. egrep "(grouping)" file.txt

Алтернација

Слично на тоа како изразите на заградите можат да наведат различни можни избори за совпаѓање со еден знак, алтернацијата ви овозможува да наведете алтернативни совпаѓања за низи или множества изрази.

За да покажете алтернација, користете го знакот на цевката |. Тие често се користат во групирање во заграда за да се специфицира дека една од двете или повеќе можности треба да се смета за совпаѓање.

Следното ќе најде или GPL или Општа јавна лиценца во текстот:

  1. 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 во изборна група:

  1. 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 плус еден или повеќе знаци кои не се знаци со празно место:

  1. 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 што содржат тројни самогласки:

  1. grep -E "[AEIOUaeiou]{3}" GPL-3

Секој вратен ред има збор со три самогласки:

Output
changed, 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 знаци, користете го следниов израз:

  1. 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 е корисен за пронаоѓање шеми во датотеките или во хиерархијата на датотечниот систем, па затоа вреди да се потроши време за да се чувствувате удобно со неговите опции и синтакса.

Редовните изрази се уште поразновидни и можат да се користат со многу популарни програми. На пример, многу текстуални уредувачи имплементираат регуларни изрази за пребарување и замена на текст.

Понатаму, повеќето современи програмски јазици користат редовни изрази за извршување на процедури на одредени податоци. Откако ќе ги разберете редовните изрази, ќе можете да го пренесете тоа знаење на многу вообичаени задачи поврзани со компјутерот, од извршување на напредни пребарувања во вашиот уредувач на текст до потврдување на внесувањето на корисникот.