Trädvy Permalänk
Medlem
Plats
Tidaholm
Registrerad
Nov 2009

Bash, grep och pipe

Hej!

Jag håller på med en kurs i Datorteknik och just nu en uppgift i Bash.

Jag kör Raspbian på en Rasppbery Pi 3. Och kör terminalen från Windows dator med PuTTY.

Uppgiften är:

Gör ett script som skapar en fil som innehåller en förteckning av vissa filer från din hemmakatalog som bygger på ett urval.

Urvalet kan antigen vara filer som har en viss filändelse eller som är skapade senast eller tidigast ett visst datum.

Här ska du jobba med "pipes" och "grep".

Jag lyckades göra ett körbart script i tidigare uppgift där man bara skulle lista innehållet i hemmappen, kopiera, döpa om och flytta till ny mapp.
Kort:
ls -l > alla_filer
mkdir nymapp
cp alla_filer nymapp/lista

Jag tänkte nu att man kunde göra såhär:
ls -l | grep *.txt >textdokument

För att få filen textdokument där alla filer med filändelsen .txt listas. Men jag får bara ett tomt textdokument.

Men gör jag såhär: utan *
ls -l | grep txt >textdokument

Listas både mappar och filer som någonstans innehåller "txt".
Jag vill alltså bara lista filerna med filändelsen .txt

Finns enklare sätt men måste använda mig av grep och pipe.
Tacksam för hjälp!

Tar gärna emot tips på det andra alternativet också där man gör på samma sätt fast endast listar filer skapade senast eller tidigast ett visst datum.

Blir mycket text här nu men vill tillägga att jag har googlat och letat men hittar bara hur man gör utan grep och pipe.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Nov 2008
Skrivet av wicerd:

Hej!

Jag håller på med en kurs i Datorteknik och just nu en uppgift i Bash.

Jag kör Raspbian på en Rasppbery Pi 3. Och kör terminalen från Windows dator med PuTTY.

Uppgiften är:

Gör ett script som skapar en fil som innehåller en förteckning av vissa filer från din hemmakatalog som bygger på ett urval.

Urvalet kan antigen vara filer som har en viss filändelse eller som är skapade senast eller tidigast ett visst datum.

Här ska du jobba med "pipes" och "grep".

Jag lyckades göra ett körbart script i tidigare uppgift där man bara skulle lista innehållet i hemmappen, kopiera, döpa om och flytta till ny mapp.
Kort:
ls -l > alla_filer
mkdir nymapp
cp alla_filer nymapp/lista

Jag tänkte nu att man kunde göra såhär:
ls -l | grep *.txt >textdokument

För att få filen textdokument där alla filer med filändelsen .txt listas. Men jag får bara ett tomt textdokument.

Men gör jag såhär: utan *
ls -l | grep txt >textdokument

Listas både mappar och filer som någonstans innehåller "txt".
Jag vill alltså bara lista filerna med filändelsen .txt

Finns enklare sätt men måste använda mig av grep och pipe.
Tacksam för hjälp!

Tar gärna emot tips på det andra alternativet också där man gör på samma sätt fast endast listar filer skapade senast eller tidigast ett visst datum.

Blir mycket text här nu men vill tillägga att jag har googlat och letat men hittar bara hur man gör utan grep och pipe.

man grep i terminalen alt http://www.gnu.org/software/grep/manual/grep.html
Kika på hur regular expression fungerar. T.ex ls | grep -E 'MyPattern'
-E anger extended regular expression. Extended är något jag trivs bättre med att jobba med - men ni kanske inte får använda det?

Så borde du rätt snabbt klura ut hur du ska få enbart .txt filer eller vilken ändelse du nu vill plocka fram.

Citera! Gaming: Chassi: FD R4| CPU: 7700K | Kylare: Noctua NH-D14 | MB: MSI Z270 GAMING PRO CARBON | Grafikkort: GTX1080 | RAM: Corsair LPX 16GB 3333MHz CL16 | OS:Disk: Intel 600p 512GB | PSU: EVGA Supernova 850 G2 |
Servrar: x2 DL380 G7 x2 X5660 - 294/240GB Ram (VM Pfsense + annat)
Desktop i7 2600K - 8GB + HP DL360 G7 2xE5620 -16GB Ram (ej i drift)

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Argumentet till grep är ett regex — ett reguljärt uttryck. *.txt tolkas som "noll eller flera gånger, följt av vilket tecken som helst en gång, följt av sekvensen 'txt'". Det misslyckas i och med att uttrycket börjar med en kvantifiering utan någon antydan om vad som förväntas komma noll eller flera gånger.

grep \\.txt$ gör det du vill: grepa efter rader där sekvensen .txt, följt av slut av rad ($) förekommer. Dollartecknet gör att vi inte råkar ta med saker som .txt.zip, och \ behövs för att få grep att tolka punkt som ett punkttecken snarare än ett godtyckligt tecken.

För att bash inte ska tolka \ som en escape character använder vi dubbla bakåtslash (escape escape). Vi kan även innesluta argumentet till grep i single-quotes för samma ändamål: '\.txt$'

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Tidaholm
Registrerad
Nov 2009
Skrivet av qhrizz:

man grep i terminalen alt http://www.gnu.org/software/grep/manual/grep.html
Kika på hur regular expression fungerar. T.ex ls | grep -E 'MyPattern'
-E anger extended regular expression. Extended är något jag trivs bättre med att jobba med - men ni kanske inte får använda det?

Så borde du rätt snabbt klura ut hur du ska få enbart .txt filer eller vilken ändelse du nu vill plocka fram.

Skrivet av Teknocide:

Argumentet till grep är ett regex — ett reguljärt uttryck. *.txt tolkas som "noll eller flera gånger, följt av vilket tecken som helst en gång, följt av sekvensen 'txt'". Det misslyckas i och med att uttrycket börjar med en kvantifiering utan någon antydan om vad som förväntas komma noll eller flera gånger.

grep \\.txt$ gör det du vill: grepa efter rader där sekvensen .txt, följt av slut av rad ($) förekommer. Dollartecknet gör att vi inte råkar ta med saker som .txt.zip, och \ behövs för att få grep att tolka punkt som ett punkttecken snarare än ett godtyckligt tecken.

För att bash inte ska tolka \ som en escape character använder vi dubbla bakåtslash (escape escape). Vi kan även innesluta argumentet till grep i single-quotes för samma ändamål: '\.txt$'

Stort tack för snabbt svar!
Nu har jag löst uppgiften och börjar förstå hur grep ska användas