Linux:Sed és awk
A lap korábbi változatát látod, amilyen Admin (vitalap | szerkesztései) 2010. április 25., 20:05-kor történt szerkesztése után volt.
Sed
- Készíts shell scripet, mely egy megadott fájl tartalmát úgy jeleníti meg, hogy az összes
this code> szót cseréli a
that code> szóra!
- Az előző feladatot oldd meg úgy, hogy a módosított szöveget írd vissza az eredeti fájlba! A módosítás előtti állapotról .bak kiterjesztéssel készüljön egy biztonsági másolat!
#!/bin/bash echo -n "File: " read FILE if [ ! -f $FILE ] ; then echo "$FILE nem található" exit 1 fi mv $FILE $FILE.bak cat $FILE.bak | sed 's/this/that/g' >$FILE
Awk
- Készíts awk programot, mely a /etc/passwd fájlból kiírja a felhasználók bejelentkezési neveit!
#!/bin/bash cat /etc/passwd | awk -F: '{ print $1; }'
- Készíts programot, mely kiszámítja a 3 négyzetét! A kiíráshoz használd a printf() függvényt!
#!/bin/bash cat /etc/passwd | awk -F: ' BEGIN { printf ("3^3=%d\n",3^3) ; }'
- Írasd ki a /etc/passwd fájlban található UID-eket lebegőpontos (6 egész és 2 tizedes), egész, oktális és hexadecimális számként, végül jelenítsd meg a felhasználó bejelentkezési nevét is!
#!/bin/bash cat /etc/passwd | awk -F: ' { printf("User ID: %+6.2f %d %o %X %s\n", $3, $3, $3, $3, $1); }'
- Írasd ki a /etc/passwd fájl tartalmát nagybetűssé alakítva! Az egyes sorok legyenek sorszámozva!
#!/bin/bash FILE="/etc/passwd" cat $FILE | awk -F ' { printf ("%d: %s\n", NR, toupper($0)); }'
- Számítsd ki a /etc/passwd fájlban levő UID-ek összegét és átlagát! (Tudjuk, hogy ez az adat semmire sem utal, csupán azért használjuk ezt a fájlt, mert minden rendszerben megtalálható.)
#!/bin/bash cat /etc/passwd | awk -F: ' BEGIN { SUM=0; } { SUM=SUM+$4; } END { print ("Az osszeg: "SUM); print ("Az atlag: " SUM/NR); }'
- Írd ki a képernyőre a /etc/group fájl leghosszabb sorát! [Módosíthatod a feladatot úgy, hogy a legrövidebb nem üres sort jelentítsd meg!]
#!/bin/bash FILE=/etc/group cat $FILE | awk -F: ' BEGIN { mx = 0; sor = ""; } { if ( length($0) > mx ) { mx = length($0); sor = $0; } } END { printf( "A leghosszabb sor hossza: %d\n", mx); printf ("A leghosszabb sor: %s\n", sor); }'
- Ellenőrizd, hogy mely felhasználóknak van 0-s UID-jük a /etc/passwd-ben! (Ezek teljes jogkörrel rendelkeznek a Unix rendszerekben.)
#!/bin/bash cat /etc/passwd | awk -F: ' BEGIN { print ("Rendszergazdák keresése:") } { if ($3==0) print ($0); }'
- Jelenítsd meg az acer.txt fájl sorait úgy, hogy a 40 karakternél hosszabb sorokat ne teljes hosszukban, hanem csak az első 40 karakterig írd ki, és annak jelzésére, hogy a sor ennél hosszabb, a végére írj három pontot! Minden sor elején jelenjen meg, hogy mekkora annak teljes hossza!!
FILE=acer.txt if [ ! -f $FILE ] ; then echo "$FILE nem található" exit 1 fi HOSSZ=40 # -v H=$HOSSZ hatására az awk program indulásakor a H változó értéke a $HOSSZ lesz. cat $FILE | grep -v ^$ | awk -F -v H=$HOSSZ ' { printf ("[%d] ", length($0)); if ( length($0) > H ) printf ("%s...\n", substr($0, 0, H)); else printf ("%s\n",$0); }'
- Jelenítsd meg a 10-nél kisebb pozitív egész számokat és négyzeteiket!
#!/usr/bin/awk -f BEGIN { for ( i=9; i>0; i-- ) { printf ("%d %d\n",i, i*i); } }
- Jelenítsd meg az /etc/passwd fájl sorait úgy, hogy a mezőket visszafelé íratod ki! Azaz az első mező utolsóként, a második utolsó előttiként, az utolsó pedig elsőként jelenjen meg!
#!/bin/bash cat /etc/passwd | awk -F: ' { for (i=NF; i>0; i--) printf ("%s ",$i) printf ("\n") }'
- Jelenítsd ,eg az /etc/passwd fájlt úgy, hogy minden sort visszafelé íratsz ki!
cat a.txt | grep -v ^# | awk -F' ' ' function printRev(x) { a = length(x) ; r=""; while ( a >= 0 ) { r=r substr(x,a,1); a=a-1; } return r } { printf ( "%s\n", printRev($0) ); }’
- Írasd ki az /etc/passwd fájt sorait visszafelé, azaz a legutolsó sor jelenjen meg elsőként, az első pedig utolsóként!
#!/bin/bash FILE=/etc/passwd cat $FILE | awk -F: ' { line[NR]=$0 } END { for(i=NR; i>0; i--) print line[i] }'
- Készíts a /tmp/szolista.txt fájl szavairól előfordulási gyakoriságukat tartalmazó listát! A lista legyen rendezett, elöl a legtöbbet előforduló szó szerepeljen! Példa a kimenetre:
- 292 the
- 166 a
- 156 of
#!/bin/bash FILE=/tmp/szolista.txt if [ ! -f $FILE ] ; then echo "$FILE nem található" exit 1 fi cat $FILE | awk -F: ' { szo[$1]++ } END { for (i in szo) print (szo[i], i) }' | sort -n -r | more
- Készíts gyakorisági listát a /etc/passwd fájlban található shellekről, melyik hányszor fordul elő?
#!/bin/bash cat /etc/passwd | awk -F: ' { shells[$7]++ } END { for (i in shells) print (shells[i], i) } ' | sort -n -r