Bestanden
doorzoeken met grep-opdrachten
|
Nu gaan we
kennis maken met de groep van grep-opdrachten
We gaan hier in op grep, egrep en fgrep
Om met deze opdrachten te kunnen werken, is het van belang dat je
weet hoe enkele van de hiervoor besproken technieken voor patroonvergelijking
gebruikt
Met de genoemde grep-opdrachten kan je bestanden doorzoeken en bepaalde
tekst uit bestanden laten weergeven
Alle grep opdrachten zijn gebaseerd op het regel voor regel laten
weergeven van bestanden
Je kunt ook afzonderlijke bestanden doorzoeken, maar ook groepen van
bestanden
De verschillende grep-opdrachten werken op globaal dezelfde manier
en allemaal kennen ze bijna twintig verschillende opties
Het enige echte verschil is dat de opdracht egrep gebruikmaakt van
een iets afwijkende syntaxis voor patroonvergelijking, terwijl fgrep
werkt met vaste strings
We zullen van elk van deze opdrachten voorbeelden geven, waarbij we
enkele veelgebruikte opties toepassen
Om de verschillen in syntaxis van de zoekpatronen van deze programma's
te demonstreren, zullen we hier diverse zoekpatronen loslaten op de
Linux Basic Installation Guide van Matt Welsh
Als je bijvoorbeeld in deze handleiding alle regels wilt opzoeken
die beginnen met een cijfer, gebruik je de volgende syntaxis:
|
#
grep ^[0-9] guide.txt
1 Introduction to Linux
2 Obtaining and Installing Linux
3 Linux Tutorial
4 System Administration
...
# egrep ^[0-9] guide.txt
1 Introduction to Linux
2 Obtaining and Installing Linux
3 Linux Tutorial
4 System Administration
...
# fgrep ^[0-9] guide.txt |
1
40
85
137
1
40
85
137 |
Je
ziet dat zowel grep als egrep zoekresultaten pleveren(we hebben hier
steeds alleen de eerste vier regels van de uitvoer weergegeven)
Het blijkt echter dat fgrep niet met reguliere expressies werkt; je
kan fgrep alleen met vaste patronen of strings gebruiken, zaols in
het volgende voorbeeld:
|
#
fgrep friend guide.txt
Large extent by the window manager. This friendly
program is in copy Linux from a friend who may already have software,
or share (Unfortunately, the system was being unfriendly.) |
Probeer
nu eens om met behulp van egrep de tekst te doorzoeken op de letter
b tussen haakjes:
|
#
egrep '\([b]\)' guide.txt
( see Section 1.8 for a list of compatible boards), or (b) there is
an connect to the network, or (b) you have a "dynamic" IP
address, |
Het
blijkt dat in het bestand precies twee regels voorkomen met de tekens
(b)
Laten we eens kijken wat er gebeurt als we hetzelfde doen met de opdracht
grep:
|
#
grep '\([b]\)' guide.txt
This is version 2.2.2 of the book, 'Linux Installation and Getting
to PostScript printers. This document was generated by a set of tools
from laTeX source, so there may be a number of formatting problems.
This is not the 'official' version of the book! Plaese see
... |
Oeps
dat was niet helemaal de bedoeling!
Zoals je ziet , gebruikt grep een andere syntaxis dan egrep
Het kan eenvoudiger:
|
#
grep '(b)' guide.txt
( see Section 1.8 for a list of compatible boards), or (b) there
is an connect to the network, or (b) you have a "dynamic"
IP address, |
Dit
zoek patroon werkt zoawel met grep als met fgrep
als je dit patroon gebruikt met egrep, krijg je hetzelfde resultaat
als wanneer je uitgebreide reguliere expressies gebruikt met grep(in
dit geval dus alle regels waarop de letter b voorkomt)
De verschillende grep-programma's werken met bijna dezelfde verzameling
opties
Een veel gebruikte optie is -n, voor regelnummering
Met deze optie zie je direct welke regels in de tekst de gezochte
patronen bevatten
Deze optie werkt met alle grep-opdrachten:
|
#
egrep -n friend guide.txt
1242: Large extent by the window manager. This
friendly program
1942: Linux from a friend who may already have the software,
5161: (Unfortunately , the system was being unfriendly.) |
Je
ziet dat de gezochte tekst is gevonden op regel 1242,1942 en 5161
Verder is het ook erg handig dat niet voor iedere herhaalde zoekactie
de zoekpatronen opnieuw hoeft op te geven
Als je bijvoorbeeld verschillende bestanden wilt doorzoeken op steeds
dezelfde woorden, dan kun je deze woorden in een tekstbestand opnemen,
dat vervolgens door grep wordt gebruikt
Maak eerst het tekst bestand aan en gebruik vervolgens grep met de
optie -f om aan te geven dat je dit tekstbestand wilt gebruiken:
|
#
cat > mywords
wonderful
Typewriter
War
# grep -nf mywords guide.txt
574: Typewriter Used to represent screen interaction, as in
617: software since the orginal Space War, or, more recently
1998: Now you must be convinced of how wonderful way to relieve the
2549: inanimate object is a wonderful way to relieve the
3790: Warning : Linux cannot currently use 33090 sectors
7780: the magic hat when it is not needed, despite the wondeful
10091: wonderful programs and configurations are availeble with a |
Let
er hierbij op dat je de optie -n (voor regelnummers) voor de optie
-f plaatst ander krijg je een foutmelding waarin grep zegt dat het
bestand met de naam n niet kan worden gevonden en de zoekactie daarom
wordt afgebroken
Met de optie -F werkt grep op dezelfde manier als fgrep en met de
optei -E als egrep
Verder kun je op je systeem ook nog een andere versie van grep vinden,
de opdracht zgrep, die geschikt is om gecomprimeerde bestanden mee
te doorzoeken |
| |
| |
| |
| |