GNU/Linux >> Znalost Linux >  >> Linux

Regulární výrazy v příkazu Grep s 10 příklady – část I

Regulární výrazy se používají k vyhledávání a manipulaci s textem na základě vzorů. Většina příkazů a programovacích jazyků Linuxu používá regulární výraz.

Příkaz Grep se používá k vyhledání určitého řetězce v souboru. 15 praktických příkladů příkazů grep najdete v našem dřívějším článku.

Regulární výrazy můžete také použít s příkazem grep, když chcete hledat text obsahující konkrétní vzor. Regulární výrazy vyhledávají vzory na každém řádku souboru. Zjednodušuje to naše vyhledávací operace.

Tento článek je součástí série 2 článků.

Tento článek 1 části popisuje příklady grep pro jednoduché regulární výrazy. Budoucí článek 2 se bude zabývat pokročilými příklady regulárních výrazů v grep.

Vezměme si soubor /var/log/messages, který bude použit v našich příkladech.

Příklad 1. Začátek řádku ( ^ )

V příkazu grep se stříška Symbol ^ shoduje s výrazem na začátku řádku. V následujícím příkladu zobrazuje všechny řádky, které začínají 10. listopadu, tj. všechny zprávy přihlášené 10. listopadu.

$ grep "^Nov 10" messages.1
Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10
Nov 10 01:18:49 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3
Nov 10 13:21:26 gs123 ntpd[2241]: time reset +0.146664 s
Nov 10 13:25:46 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10
Nov 10 13:26:27 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3

Znak ^ odpovídá výrazu na začátku řádku, pouze pokud se jedná o první znak regulárního výrazu. ^N odpovídá řádku začínajícím na N.

Příklad 2. Konec řádku ( $)

Znak $ odpovídá výrazu na konci řádku. Následující příkaz vám pomůže získat všechny řádky končící slovem „terminating“.

$ grep "terminating.$" messages
Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.

Z výše uvedeného výstupu můžete zjistit, kdy byl ukončen celý protokol jádra. Stejně jako ^ odpovídá začátku řádku pouze v případě, že se jedná o první znak, $ odpovídá konci řádku pouze v případě, že se jedná o poslední znak v regulárním výrazu.

Příklad 3. Počet prázdných řádků ( ^$ )

Pomocí znaků ^ a $ můžete najít prázdné řádky dostupné v souboru. „^$“ určuje prázdný řádek.

$ grep -c  "^$" messages anaconda.log
messages:0
anaconda.log:3

Výše uvedené příkazy zobrazí počet prázdných řádků dostupných ve zprávách a souborech anaconda.log.

Příklad 4. Jeden znak (.)

Speciální metaznak „.“ (tečka) odpovídá libovolnému znaku kromě znaku konce řádku. Vezměme vstupní soubor, který má obsah následovně.

$ cat input
1. first line
2. hi hello
3. hi zello how are you
4. cello
5. aello
6. eello
7. last line

Nyní hledejme slovo, které má libovolný znak následovaný ello. tedy ahoj, violoncello atd.,

$ grep ".ello" input
2. hi hello
3. hi zello how are you
4. cello
5. aello
6. eello

V případě, že chcete vyhledat slovo, které má pouze 4 znaky, můžete zadat grep -w „…“. kde jedna tečka představuje libovolný jednotlivý znak.

Příklad 5. Žádný nebo více výskytů (*)

Speciální znak „*“ odpovídá nulovému nebo více výskytu předchozího znaku. Vzor „1*“ například odpovídá nule nebo více „1“.

Následující příklad hledá vzor „kernel:*“, tj. jádro:a žádný nebo více výskytů mezery.

$ grep "kernel: *." *
messages.4:Jul 12 17:01:02 cloneme kernel: ACPI: PCI interrupt for device 0000:00:11.0 disabled
messages.4:Oct 28 06:29:49 cloneme kernel: ACPI: PM-Timer IO Port: 0x1008
messages.4:Oct 28 06:31:06 btovm871 kernel:  sda: sda1 sda2 sda3
messages.4:Oct 28 06:31:06 btovm871 kernel: sd 0:0:0:0: Attached scsi disk sda
.
.

Ve výše uvedeném příkladu se shoduje se symbolem jádra a dvojtečky následovaným libovolným počtem mezer/bez mezery a „.“ odpovídá libovolnému jednotlivému znaku.

Příklad 6. Jeden nebo více výskytů (\+)

Speciální znak „\+“ odpovídá jednomu nebo více výskytům předchozího znaku. ” \+” odpovídá alespoň jednomu nebo více znakům mezery.

Pokud není místo, nebude to odpovídat. Znak „+“ spadá pod rozšířený regulární výraz. Takže musíte uniknout, když jej chcete použít s příkazem grep.

$ cat input
hi hello
hi    hello how are you
hihello

$ grep "hi \+hello" input
hi hello
hi    hello how are you

Ve výše uvedeném příkladu se vzor grep shoduje se vzorem „ahoj“, za nímž následuje jedna nebo více mezer a za nimi „ahoj“.

Pokud mezi hi a hello není mezera, nebude to odpovídat. Znak * však odpovídá žádnému nebo více výskytům.

„hihello“ bude odpovídat *, jak je uvedeno níže.

$ grep "hi *hello" input
hi hello
hi    hello how are you
hihello
$

Příklad 7. Nula nebo jeden výskyt (\?)

Speciální znak „?“ odpovídá nule nebo jednomu výskytu předchozího znaku. "0?" odpovídá jedné nule nebo ničemu.

$ grep "hi \?hello" input
hi hello
hihello

„hi \?hello“ odpovídá „hi a hello“ s jednou mezerou (hi ahoj) a bez mezery (hihello).

Řádek, který má více než jednu mezeru mezi hi a hello, se ve výše uvedeném příkazu neshodoval.

Příklad 8. Escapování speciálního znaku (\)

Pokud chcete v obsahu hledat speciální znaky (např.:* , tečka), musíte speciální znak v regulárním výrazu zakódovat.

$ grep "127\.0\.0\.1"  /var/log/messages.4
Oct 28 06:31:10 btovm871 ntpd[2241]: Listening on interface lo, 127.0.0.1#123 Enabled

Příklad 9. Třída znaků ([0-9])

Třída znaků není nic jiného než seznam znaků zmíněných v hranaté závorce, která se používá pro shodu pouze jednoho z několika znaků.

$ grep -B 1 "[0123456789]\+ times" /var/log/messages.4
Oct 28 06:38:35 btovm871 init: open(/dev/pts/0): No such file or directory
Oct 28 06:38:35 btovm871 last message repeated 2 times
Oct 28 06:38:38 btovm871 pcscd: winscard.c:304:SCardConnect() Reader E-Gate 0 0 Not Found
Oct 28 06:38:38 btovm871 last message repeated 3 times

Opakované zprávy budou zaznamenány do souboru protokolu zpráv jako „poslední zpráva opakovaná nkrát“. Výše uvedený příklad hledá řádek, který má libovolné číslo (0 až 9), za nímž následuje slovo „krát“. Pokud se shoduje, zobrazí řádek před odpovídajícím řádkem a také odpovídající řádek.

Pomocí v hranaté závorce můžete pomocí pomlčky určit rozsah znaků. Podobně jako [0123456789] může být reprezentováno [0-9]. Rozsah abeced může být také specifikován jako [a-z], [A-Z] atd. Výše ​​uvedený příkaz lze tedy také zapsat jako

$ grep -B 1 "[0-9]\+ times" /var/log/messages.4

Příklad 10. Výjimka ve třídě znaků

Pokud chcete vyhledat všechny znaky kromě znaků v hranaté závorce, použijte symbol ^ (stříška) jako první znak za otevřenou hranatou závorkou. Následující příklad hledá řádek, který nezačíná samohláskou ze souboru slov ve slovníku v linuxu.

$ grep -i  "^[^aeiou]" /usr/share/dict/linux.words
1080
10-point
10th
11-point
12-point
16-point
18-point
1st
2

První stříška v regulárním výrazu představuje začátek řádku. Symbol stříšky uvnitř hranaté závorky však představuje „kromě“ – tj. shodu kromě všeho v hranaté závorce.


Linux
  1. JQ Command v Linuxu s příklady

  2. Pokročilé regulární výrazy v příkazu Grep s 10 příklady – část II

  3. Jak používáte regulární výrazy s příkazem cp v Linuxu?

  1. wc Linux Command s příklady

  2. Linux řazení příkazů s příklady

  3. Příkaz Nohup s příklady

  1. Echo Command v Linuxu (s příklady)

  2. man Command v Linuxu s příklady

  3. Příkaz AWK v Linuxu s příklady