Permalänk
Medlem

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.

Permalänk
Medlem
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.

Visa signatur

Gaming: Asus 3080 Ti + 5900X
Proxmox: Intel NUC,i7-8559U + i5-8259U 32GB Ram
Rojter: UCG-Ultra, WAN 1000/1000

Permalänk
Medlem

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$'

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
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