ResursIntroduktion till GNU grepBehandlar: Introduktion till kommandot grep. |
grep är ett användbart kommando som filtrerar texter genom att antingen välja ut de rader man vill ha, eller genom att välja bort rader som är ointressanta. Rader väljs genom sökuttryck som matchar någonstans på raden.
Det finns åtminstone fyra olika varianter av kommandot grep på IDA:s datorsystem. Det man vanligen använder är grep (utan sökväg). Nackdelen med det är att det bara hanterar basala reguljära uttryck. Det duger vid enklare uppgifter, men klarar inte av det vi behöver göra i de här laborationerna. Vi kommer använda GNU grep som hittas som /sw/gnu/bin/grep eller bara ggrep. Utan vidare argument funger GNU grep som det vanliga kommandot grep, dvs det letar upp och skriver ut alla de rader i de givna filerna som matchar ett basalt reg.uttryck. ggrep accepterar också de utvidgade reguljära uttrycken som mönster om det får flaggan -E (extended). GNU versionen av grep är väl standardiserat och återfinns på många datorsystem.
Följande kommando använder ggrep för att skriva ut alla rader som matchar det reguljära uttrycket på skärmen:
ggrep -E 'reg.uttryck' textfil1 textfil2 ...och flaggan -E får inte glömmas. Annars får man inte tillgång till de utvidgade reg.uttrycken. Mönstret tolkas då som ett basalt reg.uttryck, vilket kan få en att tro att det inte finns rader, som träffar. Jämför t.ex. anropen:
ggrep -E 't{2}' textfil
som hittar alla rader, med dubbelskrivet "t" på, och det
"felaktiga" anropet:
ggrep 't{2}' textfil
där flaggan -E glömts av misstag. I det senare
fallet så
tolkas mönstret såsom ett BRU, och i basala
reg.uttryck så är
tyvärr klamrarna inte speciella!! Alltså kommer
anropet
(antagligen) inte att ge några rader alls såsom
träffar, för det
mönster man letar efter är ju:
Chansen att detta är vad man ville söka efter är ganska liten, så var noga med att få med flaggan. När man arbetar med reg.uttryck gäller det att hålla reda på varje enstaka tecken: alla tecken har någon betydelse i ett uttryck, och det gäller att veta vilken.
De textfiler man vill söka igenom radar man bara upp efter varandra, som de sista argumenten till kommandot. Hur man skriver utvidgade reguljära uttryck är däremot mycket svårare att förklara. Ni kan läsa om deras syntax i Kort introduktion till reguljära uttryck. Obs! ggrep -E klarar inte av att tolka uttrycket '\t' som en tab (trots att det i övrigt tolkar utökade reguljära uttryck). För att matcha en tab måste man istället skriva tab-tecknet. Detta kan man inte göra i terminalen, utan man måste istället skriva det i ett skript. gsed däremot läser \t som en tab.
I övrigt finns inte mycket att tillägga om ggrep annat än att det finns några andra flaggor vid sidan av -E, som kan vara användbara i vissa situationer.
| -E | Tolka mönstret såsom ett utvidgat reguljärt uttryck (URU). |
| -i | Strunta i om matchade bokstäver är stora eller små i textfilerna (case insensitive). |
| -v | Vänd på innebörden i matchningen, dvs skriv ut de rader som inte matchar. Filtrerar bort ointressanta rader. |
| -f fil | Läs mönstrena från en fil, ett mönster per rad. |
| -A NUM | Skriv inte bara matchad rad utan NUM rader efter
den matchande, -A 3 skriv de 3 efterföljande raderna också |
| -B NUM | Skriv inte bara matchad rad utan NUM rader före
den matchande, -B 2 skriv 2 rader före matchad rad också |
| -n | Föregå varje matchad rad med sitt radnummer i sin textfil |
| -w | Ta bara med rader, där reg.uttrycket finns med som ett helt, eget ord. Detta är samma, som man själv kan åstadkomma genom att helt enkelt omge sitt reg.uttryck med "barriärer": \b på ömse sidor om det. |