103.7 Lecke 2
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
103 GNU és Unix parancsok |
Fejezet: |
103.7 Keresés szövegfájlokban reguláris kifejezések segítségével |
Lecke: |
2/2 |
Bevezetés
Az adatok csővezetékes parancsok láncolatán keresztül történő áramoltatása lehetővé teszi a reguláris kifejezéseken alapuló összetett szűrők alkalmazását. A reguláris kifejezések nemcsak a rendszergazdai munka során, hanem az adatbányászatban és a kapcsolódó területeken is fontos technikát jelentenek. Két parancs kifejezetten alkalmas fájlok és szöveges adatok szabályos kifejezésekkel történő manipulálására: a grep
és a sed
. A grep
egy mintakereső, a sed
pedig egy folyamszerkesztő. Önmagukban is hasznosak, de más folyamatokkal együtt dolgozva kiemelkedőek.
A mintakereső: grep
A grep
egyik legáltalánosabb felhasználási módja a hosszú fájlok vizsgálatának megkönnyítése, a reguláris kifejezést az egyes sorokra alkalmazott szűrőként használva. Használható arra, hogy csak a bizonyos kifejezéssel kezdődő sorokat jelenítse meg. Például a grep
használható a kernelmodulok konfigurációs fájljának vizsgálatára, csak az opciós sorokat listázva:
$ grep '^options' /etc/modprobe.d/alsa-base.conf options snd-pcsp index=-2 options snd-usb-audio index=-2 options bt87x index=-2 options cx88_alsa index=-2 options snd-atiixp-modem index=-2 options snd-intel8x0m index=-2 options snd-via82xx-modem index=-2
A pipe |
karakterrel egy parancs kimenete átirányítható közvetlenül a grep
bemenetére. A következő példa egy zárójeles kifejezést használ az fdisk -l
kimenetéből azon sorok kiválasztására, amik Disk /dev/sda
-val vagy Disk /dev/sdb
-val kezdődnek:
# fdisk -l | grep '^Disk /dev/sd[ab]' Disk /dev/sda: 320.1 GB, 320072933376 bytes, 625142448 sectors Disk /dev/sdb: 7998 MB, 7998537728 bytes, 15622144 sectors
Az egyezéseket tartalmazó sorok puszta kiválasztása nem biztos, hogy megfelelő egy adott feladathoz, így a grep
viselkedését a kapcsolókkal kell módosítani. Például a -c
vagy --count
kapcsoló arra utasítja a grep
-et, hogy írja ki, hány sorban volt találat:
# fdisk -l | grep '^Disk /dev/sd[ab]' -c 2
A kapcsolót a reguláris kifejezés előtt vagy után lehet elhelyezni. Más fontos grep
kapcsolók a következők:
-c
or--count
-
Ahelyett, hogy megjelenítené a keresési eredményeket, csak az összesített számot jeleníti meg, hogy hányszor fordul elő az egyezés bármely adott fájlban.
-i
or--ignore-case
-
A kis- és nagybetű érzékeny keresés bekapcsolása.
-f FILE
or--file=FILE
-
Adjuk meg a használni kívánt reguláris kifejezést tartalmazó fájlt.
-n
or--line-number
-
A sor számának megjelenítése.
-v
or--invert-match
-
Minden sor kijelölése, kivéve az egyezéseket tartalmazó sorokat.
-H
or--with-filename
-
A sort tartalmazó fájl nevének kiírása.
-z
or--null-data
-
Ahelyett, hogy a
grep
a bemeneti és kimeneti adatfolyamokat külön sorokként kezelné (alapértelmezés szerint a newline használatával), a bemenetet vagy a kimenetet sorok sorozatának tekinti. Ha afind
parancs kimenetét a-print0
kapcsolót használva kombináljuk agrep
paranccsal, akkor a-z
vagy a--null-data
kapcsolót kell használni a folyam azonos módon történő feldolgozásához.
Bár alapértelmezés szerint több fájl elérési útvonalának megadásakor aktiválva van, a -H
kapcsoló nem aktiválódik egyetlen fájl esetén. Ez speciális helyzetekben kritikus lehet, például amikor a grep
-et közvetlenül a find
hívja meg:
$ find /usr/share/doc -type f -exec grep -i '3d modeling' "{}" \; | cut -c -100 artistic aspects of 3D modeling. Thus this might be the application you are This major approach of 3D modeling has not been supported oce is a C++ 3D modeling library. It can be used to develop CAD/CAM softwares, for instance [FreeCad
Ebben a példában a find
felsorol minden fájlt a /usr/share/doc
alatt, majd átadja mindegyiket a grep
-nek, amely viszont a 3d modeling
szóra keres a fájlban, nem érzékelve a nagy- és kisbetűket. A pipe a cut
-hoz csak azért van, hogy a kimenet hosszát 100 oszlopra korlátozzuk. Megjegyzendő azonban, hogy nem lehet tudni, hogy a sorok melyik fájlból származnak. Ez a probléma megoldható a -H
hozzáadásával a grep
-hez:
$ find /usr/share/doc -type f -exec grep -i -H '3d modeling' "{}" \; | cut -c -100 /usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio /usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support
Most már lehetséges azonosítani azokat a fájlokat, ahol az egyezések vannak. A lista még informatívabbá tétele érdekében a találatokat tartalmazó sorokhoz elő- és utósorok adhatók:
$ find /usr/share/doc -type f -exec grep -i -H -1 '3d modeling' "{}" \; | cut -c -100 /usr/share/doc/openscad/README.md-application Blender), OpenSCAD focuses on the CAD aspects rather t /usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio /usr/share/doc/openscad/README.md-looking for when you are planning to create 3D models of machine p /usr/share/doc/opencsg/doc/publications.html-3D graphics library for Constructive Solid Geometry (CS /usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support /usr/share/doc/opencsg/doc/publications.html-by real-time computer graphics until recently.
Az -1
opció arra utasítja a grep
-t, hogy a talált egyezés elé és után is beszúrjon egy sort. Ezeket az extra sorokat context lines-nak (kontextus sor) nevezzük, és a kimeneten a fájlnév után egy mínusz jel jelzi őket. Ugyanezt az eredményt kaphatjuk a -C 1
vagy a --context=1
kapcsolóval, és más mennyiséget is megadhatunk.
A grep-nek két kiegészítő programja van: az egrep
és az fgrep
. Az egrep
program a grep -E
paranccsal egyenértékű, amely az alapvető reguláris kifejezéseken kívül más extra funkciókat is tartalmaz. Például az egrep
programmal lehetőség van a kiterjesztett reguláris kifejezések olyan funkcióinak használatára, mint az elágazás:
$ find /usr/share/doc -type f -exec egrep -i -H -1 '3d (modeling|printing)' "{}" \; | cut -c -100 /usr/share/doc/openscad/README.md-application Blender), OpenSCAD focuses on the CAD aspects rather t /usr/share/doc/openscad/README.md:artistic aspects of 3D modeling. Thus this might be the applicatio /usr/share/doc/openscad/README.md-looking for when you are planning to create 3D models of machine p /usr/share/doc/openscad/RELEASE_NOTES.md-* Support for using 3D-Mouse / Joystick / Gamepad input dev /usr/share/doc/openscad/RELEASE_NOTES.md:* 3D Printing support: Purchase from a print service partne /usr/share/doc/openscad/RELEASE_NOTES.md-* New export file formats: SVG, 3MF, AMF /usr/share/doc/opencsg/doc/publications.html-3D graphics library for Constructive Solid Geometry (CS /usr/share/doc/opencsg/doc/publications.html:This major approach of 3D modeling has not been support /usr/share/doc/opencsg/doc/publications.html-by real-time computer graphics until recently.
Ebben a példában a 3D modeling
vagy a 3D printing
felel meg a kifejezésnek, a nagy- és kisbetűket nem figyelembe véve. Ha a szövegfolyamnak csak azokat a részeit szeretnénk megjeleníteni, amelyek megfelelnek az egrep
által használt kifejezésnek, használjuk az -o
kapcsolót.
Az fgrep
program a grep -F
programmal egyenértékű, azaz nem elemzi a reguláris kifejezéseket. Hasznos egyszerű kereséseknél, ahol a cél egy szó szerinti kifejezésre való illesztés. Ezért az olyan speciális karaktereket, mint a dollárjel és a pont, szó szerint veszi, nem pedig a reguláris kifejezés szerinti jelentésben.
A folyamszerkesztő: sed
A sed
program célja a szöveges adatok nem interaktív módon történő módosítása. Ez azt jelenti, hogy minden szerkesztés előre meghatározott utasítások alapján történik, nem pedig a képernyőn megjelenő szövegbe való önkényes közvetlen beírás útján. Modern kifejezéssel élve a sed
egy sablonfeldolgozóként értelmezhető: egy szöveget bemenetként kapva, egyéni tartalmat helyez el előre meghatározott helyekre, vagy ha talál egyezést egy reguláris kifejezésre.
A sed, ahogy a neve is mutatja, jól alkalmazható a csővezetékeken keresztül áramló szövegek feldolgozására. Alapvető szintaxisa a sed -f SCRIPT
, ha a szerkesztési utasításokat a SCRIPT
fájlban tároljuk, vagy a sed -e COMMANDS
a COMMANDS
közvetlenül a parancssorból történő végrehajtásához. Ha sem az -f
, sem az -e
nincs megadva, a sed
az első nem opciós paramétert használja szkriptfájlként. Az is lehetséges, hogy egy fájlt használjunk bemenetként, ha annak elérési útját adjuk meg a sed
argumentumaként.
A sed
utasítások egyetlen karakterből állnak, amelyet egy cím előzhet meg, vagy egy vagy több kapcsoló követhet, és minden egyes sorra egyszerre alkalmazandók. A címek lehetnek egyetlen sorszám, reguláris kifejezés vagy sortartomány. Például egy szövegfolyam első sora törölhető az 1d
paranccsal, ahol az 1
azt a sort adja meg, amelyre az d
törlési parancsot alkalmazzuk. A sed
használatának tisztázásához vegyük a factor `seq 12`
parancs kimenetét, amely az 1-től 12-ig terjedő számok prímtényezőit adja vissza:
$ factor `seq 12` 1: 2: 2 3: 3 4: 2 2 5: 5 6: 2 3 7: 7 8: 2 2 2 9: 3 3 10: 2 5 11: 11 12: 2 2 3
Az első sor törlése a sed
-del az 1d
-vel történik.:
$ factor `seq 12` | sed 1d 2: 2 3: 3 4: 2 2 5: 5 6: 2 3 7: 7 8: 2 2 2 9: 3 3 10: 2 5 11: 11 12: 2 2 3
A sorok tartományát vesszővel elválasztva lehet megadni:
$ factor `seq 12` | sed 1,7d 8: 2 2 2 9: 3 3 10: 2 5 11: 11 12: 2 2 3
Egynél több utasítás is használható ugyanabban a végrehajtásban, pontosvesszővel elválasztva. Ebben az esetben azonban fontos, hogy zárójelbe zárjuk őket, hogy a pontosvesszőt a shell ne értelmezze:
$ factor `seq 12` | sed "1,7d;11d" 8: 2 2 2 9: 3 3 10: 2 5 12: 2 2 3
Ebben a példában két törlési utasítást hajtottunk végre, először az 1-től 7-ig terjedő sorokban, majd a 11. sorban. A cím lehet reguláris kifejezés is, így csak az egyező sorokat érinti az utasítás:
$ factor `seq 12` | sed "1d;/:.*2.*/d" 3: 3 5: 5 7: 7 9: 3 3 11: 11
A :.*2.*
reguláris kifejezés a 2-es szám bármelyik előfordulására illeszkedik, bárhol a kettőspont után, a 2-es számmal rendelkező sorok törlését eredményezve. A sed
használatával minden, ami a perjelek (/
) közé kerül, reguláris kifejezésnek minősül, és alapértelmezés szerint minden alapvető RE támogatott. Például a sed -e "/^#/d" /etc/services
az /etc/services
fájl tartalmát mutatja meg a #
-vel kezdődő sorok (kommentek) nélkül.
Az d
törlési utasítás csak egy a sok szerkesztési utasítás közül, amelyet a sed
biztosít. Ahelyett, hogy törölne egy sort, a sed
egy adott szövegre is kicserélheti azt:
$ factor `seq 12` | sed "1d;/:.*2.*/c REMOVED" REMOVED 3: 3 REMOVED 5: 5 REMOVED 7: 7 REMOVED 9: 3 3 REMOVED 11: 11 REMOVED
A c REMOVED
utasítás egyszerűen a REMOVED
szöveggel helyettesíti a sort. A példa esetében a c REMOVED
utasítás minden olyan sort érint, amelynek részláncai megfelelnek a :.*2.*
reguláris kifejezésnek. Az a TEXT
utasítás a TEXT
által jelzett szöveget az egyezéssel rendelkező sor utáni új sorba másolja. Az r FILE
utasítás ugyanezt teszi, de a FILE
által megjelölt fájl tartalmát másolja. A w
utasítás az r
utasítás ellenkezőjét teszi, azaz a sort a megadott fájlhoz csatolja.
A messze leggyakrabban használt sed
utasítás a s/FIND/REPLACE/
, amely arra szolgál, hogy a FIND
reguláris kifejezéssel való egyezést a REPLACE
által jelzett szöveggel helyettesítse. Például a s/hda/sda/
utasítás a szó szerinti RE hda
szócikkre illeszkedő részláncot sda
-val helyettesíti. Csak a sorban talált első egyezés lesz kicserélve, kivéve, ha az utasítás után a g
jelzőt helyezzük el, mint a s/hda/sda/g
-ban.
Egy reálisabb esettanulmány segít a sed
jellemzőinek illusztrálásában. Tegyük fel, hogy egy orvosi klinika szöveges üzeneteket szeretne küldeni ügyfeleinek, hogy emlékeztesse őket a következő napra tervezett időpontokra. Egy tipikus megvalósítási forgatókönyv egy professzionális azonnali üzenetküldő szolgáltatásra támaszkodik, amely API-t biztosít az üzenetek kézbesítéséért felelős rendszer eléréséhez. Ezek az üzenetek általában ugyanabból a rendszerből származnak, amely az ügyfelek időpontját ellenőrző alkalmazást futtatja, és amelyeket egy adott napszak vagy más esemény indít el. Ebben a hipotetikus helyzetben az alkalmazás létrehozhatna egy appointments.csv
nevű fájlt, amely táblázatos adatokat tartalmazna a következő napra vonatkozó összes időponttal, majd a sed
segítségével megjeleníthetné a szöveges üzeneteket a template.txt
nevű sablonfájlból. A CSV-fájl az adatbázis-lekérdezésekből származó adatok exportálásának szabványos módja, így a minta-időpontokat a következőképpen adhatjuk meg:
$ cat appointments.csv "NAME","TIME","PHONE" "Carol","11am","55557777" "Dave","2pm","33334444"
Az első sor tartalmazza az egyes oszlopok címkéit, amelyeket a minta sablonfájlban lévő címkékkel való egyezéshez használunk:
$ cat template.txt Helló <NAME>, ne felejtse el az időpontját holnap <TIME>-kor.
A kisebb, mint <
és nagyobb, mint >
jelek csak azért kerültek a címkék köré, hogy segítsék a címkék azonosítását. A következő Bash szkript elemzi az összes beállított találkozót a template.txt
mint üzenetsablon használatával:
#! /bin/bash TEMPLATE=`cat template.txt` TAGS=(`sed -ne '1s/^"//;1s/","/\n/g;1s/"$//p' appointments.csv`) mapfile -t -s 1 ROWS < appointments.csv for (( r = 0; r < ${#ROWS[*]}; r++ )) do MSG=$TEMPLATE VALS=(`sed -e 's/^"//;s/","/\n/g;s/"$//' <<<${ROWS[$r]}`) for (( c = 0; c < ${#TAGS[*]}; c++ )) do MSG=`sed -e "s/<${TAGS[$c]}>/${VALS[$c]}/g" <<<"$MSG"` done echo curl --data message=\"$MSG\" --data phone=\"${VALS[2]}\" https://mysmsprovider/api done
Egy valódi, gyártásra szánt szkript a hitelesítést, a hibaellenőrzést és a naplózást is kezelné, de ez a példa csak az alapfunkciókkal rendelkezik. A sed
által végrehajtott első utasítások csak az első sorra vonatkoznak — az 1
címre az 1s/^"//;1s/","/\n/g;1s/"$//p
-ben --, hogy eltávolítsa a kezdő és a záró idézőjeleket — 1s/^"//
és 1s/"$//
— és a mezőelválasztó karaktereket újsorral helyettesítse: 1s/","/\n/g
. Az oszlopnevek betöltéséhez csak az első sorra van szükség, így a nem megfelelő sorokat a -n
kapcsoló elnyomja, így az utolsó sed
parancs után a p
flaget kell elhelyezni a megfelelő sor kiírásához. A címkéket ezután a TAGS
változóban tároljuk, mint egy Bash tömböt. Egy másik Bash tömbváltozót hoz létre a mapfile
parancs az időpontokat tartalmazó sorok tárolására a ROWS
tömbváltozóban.
A for
ciklus a ROWS
-ban található minden egyes időpontot tartalmazó sor feldolgozására szolgál. Ezután az időpontban lévő idézőjeleket és elválasztójeleket — az időpont a ${ROWS[$r]}
változóban van, amelyet here string-ként használunk — a sed
helyettesíti, hasonlóan a címkék betöltésére használt parancsokhoz. Az időpont elválasztott értékeit ezután a VALS
tömbváltozóban tároljuk, ahol a tömb 0, 1 és 2 indexei a NAME
, TIME
és PHONE
értékeknek felelnek meg.
Végül egy egymásba ágyazott for
ciklus végigmegy a TAGS
tömbön, és minden egyes, a sablonban található taget kicserél a megfelelő értékkel a VALS
-ban. Az MSG
változó a renderelt sablon másolatát tartalmazza, amelyet a s/<${TAGS[$c]}>/${VALS[$c]}/g
helyettesítési parancs frissít a TAGS
minden egyes cikluson való áthaladásakor.
Ez egy ilyen megjelenített üzenetet eredményez: "Helló Carol, ne felejtse el az időpontját holnap 11-kor."` A megjelenített üzenet ezután elküldhető paraméterként egy HTTP-kérésen keresztül a curl
segítségével, e-mailként vagy bármilyen más hasonló módszerrel.
A grep és a sed kombinálása
A grep
és a sed
parancsok együttesen is használhatók, ha összetettebb szövegbányászati eljárásokra van szükség. Rendszergazdaként például megvizsgálhatjuk az összes bejelentkezési kísérletet egy szerverre. A /var/log/wtmp
fájl az összes bejelentkezést és kijelentkezést rögzíti, míg a /var/log/btmp
fájl a sikertelen bejelentkezési kísérleteket. Ezek bináris formátumban íródnak, és a last
, illetve lastb
parancsokkal olvashatók.
A lastb
kimenete nem csak a rossz bejelentkezési kísérletben használt felhasználónevet mutatja, hanem az IP-címet is:
# lastb -d -a -n 10 --time-format notime user ssh:notty (00:00) 81.161.63.251 nrostagn ssh:notty (00:00) vmd60532.contaboserver.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net pi ssh:notty (00:00) 46.6.11.56 pi ssh:notty (00:00) 46.6.11.56 nps ssh:notty (00:00) vmd60532.contaboserver.net narmadan ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net
A d
kapcsoló az IP-címet a megfelelő hosztnévre fordítja. A hosztnév nyomokat adhat az ISP-ről vagy a rossz bejelentkezési kísérletekhez használt tárhelyszolgáltatóról. Az -a
opció a hosztnevet az utolsó oszlopba helyezi, ami megkönnyíti a még alkalmazandó szűrést. A --time-format notime
opció elnyomja a bejelentkezési kísérlet időpontját. A lastb
parancs befejezése eltarthat egy ideig, ha túl sok rossz bejelentkezési kísérlet történt, ezért a kimenetet tíz bejegyzésre korlátoztuk a -n 10
kapcsolóval.
Nem minden távoli IP-hez tartozik hosztnév, így a fordított DNS nem vonatkozik rájuk, és figyelmen kívül lehet őket hagyni. Bár írhatnánk egy olyan reguláris kifejezést, amely megfelel a sor végén lévő hosztnév elvárt formátumának, valószínűleg egyszerűbb olyan reguláris kifejezést írni, amely vagy az ábécé egy betűjével, vagy a sor végén lévő egyetlen számjeggyel egyezik meg. A következő példa azt mutatja, hogy a grep
parancs hogyan veszi a standard bemeneten lévő listát, és hogyan távolítja el a hosztnév nélküli sorokat:
# lastb -d -a --time-format notime | grep -v '[0-9]$' | head -n 10 nvidia ssh:notty (00:00) vmd60532.contaboserver.net n_tonson ssh:notty (00:00) vmd60532.contaboserver.net nrostagn ssh:notty (00:00) vmd60532.contaboserver.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net pi ssh:notty (00:00) 132.red-88-20-39.staticip.rima-tde.net nps ssh:notty (00:00) vmd60532.contaboserver.net narmadan ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net nominati ssh:notty (00:00) vmd60532.contaboserver.net
A grep
parancs -v
opciója csak azokat a sorokat mutatja meg, amelyek nem egyeznek a megadott reguláris kifejezéssel. A számmal végződő sorokra (pl. [0-9]$
) illeszkedő reguláris kifejezés csak a hosztnév nélküli bejegyzéseket fogja rögzíteni. Ezért a grep -v '[0-9]$'
csak a hosztnévvel végződő sorokat fogja megmutatni.
A kimenet még tovább szűrhető, ha csak a domainnevet tartjuk meg, és minden sorból eltávolítjuk a többi részt. A sed
parancs ezt egy helyettesítési paranccsal teszi meg, amely az egész sort a benne lévő domainnévre való visszahivatkozással helyettesíti:
# lastb -d -a --time-format notime | grep -v '[0-9]$' | sed -e 's/.* \(.*\)$/\1/' | head -n 10 vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net 132.red-88-20-39.staticip.rima-tde.net 132.red-88-20-39.staticip.rima-tde.net vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net vmd60532.contaboserver.net
A feloldott zárójel .* \(.*\)$
azt mondja a sed
-nek, hogy a sornak ezt a részét jegyezze meg, vagyis az utolsó szóköz és a sor vége közötti részt. A példában erre a részre a \1
-el hivatkozunk, és a teljes sor helyettesítésére használjuk.
Nyilvánvaló, hogy a legtöbb távoli állomás többször is megpróbál bejelentkezni, így ugyanaz a tartománynév ismétlődik. Az ismétlődő bejegyzések elnyomása érdekében először rendezni kell őket (a sort
paranccsal), majd átadni a uniq
parancsnak:
# lastb -d -a --time-format notime | grep -v '[0-9]$' | sed -e 's/.* \(.*\)$/\1/' | sort | uniq | head -n 10 116-25-254-113-on-nets.com 132.red-88-20-39.staticip.rima-tde.net 145-40-33-205.power-speed.at tor.laquadrature.net tor.momx.site ua-83-226-233-154.bbcust.telenor.se vmd38161.contaboserver.net vmd60532.contaboserver.net vmi488063.contaboserver.net vmi515749.contaboserver.net
Ez azt mutatja, hogy a különböző parancsok hogyan kombinálhatók a kívánt eredmény elérése érdekében. A hosztnévlista ezután felhasználható blokkoló tűzfalszabályok írására vagy más intézkedések megtételére a szerver biztonságának megerősítése érdekében.
Gyakorló feladatok
-
A
last
parancs megjeleníti az utoljára bejelentkezett felhasználók listáját, beleértve az IP-jüket is. Hogyan lehetne azegrep
paranccsal szűrni alast
kimenetét, hogy csak az IPv4-címek előfordulását mutassa, és a megfelelő sorban lévő további információkat elvesse? -
Milyen kapcsolót kell megadni a
grep
parancsnak ahhoz, hogy a-print0
opcióval végrehajtottfind
parancs által generált kimenetet helyesen szűrje? -
Az
uptime -s
parancs megmutatja a rendszer legutóbbi bekapcsolásának dátumát, például:2019-08-05 20:13:22
. Mi lesz azuptime -s | sed -e 's/(.*) (.*)/\1/'
parancs eredménye? -
Milyen kapcsolót kell megadni a
grep
-nek, hogy a megfelelő sorokat megszámolja ahelyett, hogy megjelenítené őket?
Gondolkodtató feladatok
-
Egy HTML fájl alapvető szerkezete a
html
,head
ésbody
elemekkel kezdődik, például:<html> <head> <title>Hírportál</title> </head> <body> <h1>Főcím</h1> <p>Érdekes információ.</p> </body> </html>
Hogyan lehet a címeket a
sed
-ben úgy használni, hogy csak abody
elemet és annak tartalmát jelenítse meg? -
Milyen
sed
kifejezés távolítja el az összes taget egy HTML dokumentumból, csak a megjelenítendő szöveget megtartva? -
Az
.ovpn
kiterjesztésű fájlok nagyon népszerűek a VPN kliensek konfigurálásánál, mivel nemcsak a beállításokat, hanem a kliens kulcsainak és tanúsítványainak tartalmát is tartalmazzák. Ezek a kulcsok és tanúsítványok eredetileg különálló fájlokban vannak, ezért azokat be kell másolni az.ovpn
fájlba. Adott a következő részlet egy.ovpn
sablonból:client dev tun remote 192.168.1.155 1194 <ca> ca.crt </ca> <cert> client.crt </cert> <key> client.key </key> <tls-auth> ta.key </tls-auth>
Feltételezve, hogy a
ca.crt
,client.crt
,client.key
ésta.key
fájlok az aktuális mappában vannak, hogyan módosítaná a sablon konfigurációját ased
, hogy az egyes fájlneveket a tartalmukkal helyettesítse?
Összefoglalás
Ez a lecke a reguláris kifejezésekkel kapcsolatos két legfontosabb Linux-paranccsal foglalkozott: grep
és sed
. A szkriptek és az összetett parancsok a szövegszűrési és elemzési feladatok széles skálájához támaszkodnak a grep
-re és a sed
-re. A lecke a következő témákat járta körül:
-
Hogyan használjuk a
grep
-et és változatait, mint például azegrep
-et és azfgrep
-et. -
Hogyan használjuk a
sed
-et és annak belső utasításait a szöveg manipulálására. -
Példák a reguláris kifejezések használatára
grep
éssed
esetén.
Válaszok a gyakorló feladatokra
-
A
last
parancs megjeleníti az utoljára bejelentkezett felhasználók listáját, beleértve az IP-jüket is. Hogyan lehetne azegrep
paranccsal szűrni alast
kimenetét, hogy csak az IPv4-címek előfordulását mutassa, és a megfelelő sorban lévő további információkat elvesse?last -i | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
-
Milyen kapcsolót kell megadni a
grep
parancsnak ahhoz, hogy a-print0
opcióval végrehajtottfind
parancs által generált kimenetet helyesen szűrje?A
-z
vagy--null-data
kapcsolót, mint példáulfind . -print0 | grep -z expression
. -
Az
uptime -s
parancs megmutatja a rendszer legutóbbi bekapcsolásának dátumát, például:2019-08-05 20:13:22
. Mi lesz azuptime -s | sed -e 's/(.*) (.*)/\1/'
parancs eredménye?Hiba lép fel. Alapértelmezés szerint a zárójeleket fel kell oldani, hogy a
sed
-ben a visszautalásokat használhassuk. -
Milyen kapcsolót kell megadni a
grep
-nek, hogy a megfelelő sorokat megszámolja ahelyett, hogy megjelenítené őket?A
-c
kapcsolót.
Válaszok a gondolkodtató feladatokra
-
Egy HTML fájl alapvető szerkezete a
html
,head
ésbody
elemekkel kezdődik, például:<html> <head> <title>Hírportál</title> </head> <body> <h1>Főcím</h1> <p>Érdekes információ.</p> </body> </html>
Hogyan lehet a címeket a
sed
-ben úgy használni, hogy csak abody
elemet és annak tartalmát jelenítse meg?Ahhoz, hogy csak a
body
-t lássuk, a címeknek/<body>/,/<\/body>/
-nak kell lenniük, mint példáulsed -n -e '/<body>/,/<\/body>/p'
. A-n`kapcsoló van megadva a `sed
-nek, így alapértelmezés szerint nem jelenít meg sorokat, ezért ased
kifejezés végén lévőp
parancs a megfelelő sorok kiírására szolgál. -
Milyen
sed
kifejezés távolítja el az összes taget egy HTML dokumentumból, csak a megjelenítendő szöveget megtartva?A
sed
s/<[^>]*>//g
kifejezése a<>
közé zárt tartalmakat üres sztringre cseréli. -
Az
.ovpn
kiterjesztésű fájlok nagyon népszerűek a VPN kliensek konfigurálásánál, mivel nemcsak a beállításokat, hanem a kliens kulcsainak és tanúsítványainak tartalmát is tartalmazzák. Ezek a kulcsok és tanúsítványok eredetileg különálló fájlokban vannak, ezért azokat be kell másolni az.ovpn
fájlba. Adott a következő részlet egy.ovpn
sablonból:client dev tun remote 192.168.1.155 1194 <ca> ca.crt </ca> <cert> client.crt </cert> <key> client.key </key> <tls-auth> ta.key </tls-auth>
Feltételezve, hogy a
ca.crt
,client.crt
,client.key
ésta.key
fájlok az aktuális mappában vannak, hogyan módosítaná a sablon konfigurációját ased
, hogy az egyes fájlneveket a tartalmukkal helyettesítse?A parancs
sed -r -e 's/(^[^.]*)\.(crt|key)$/cat \1.\2/e' < client.template > client.ovpn
minden
.crt
vagy.key
végződésű sort egy olyan fájl tartalmával helyettesít, amelynek neve megegyezik a sor nevével. Az-r
kapcsoló azt mondja ased
-nek, hogy kibővített reguláris kifejezéseket használjon, míg aze
a kifejezés végén azt, hogy a találatokat acat \1.\2
parancs kimenetével helyettesítse. A\1
és\2
visszautalások megfelelnek az egyezésben található fájlnévnek és kiterjesztésnek.