Linux:Sed és awk
Sed
- Készíts shell scripet, mely egy megadott fájl tartalmát úgy jeleníti meg, hogy az összes this szót cseréli a that szóra!
#!/bin/bash
echo -n "File: "
read FILE
if [ ! -f $FILE ] ; then
echo "$FILE nem található"
exit 1
fi
cat $FILE | sed 's/this/that/g'
- 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!
<megoldas>
#!/bin/bash
cat /etc/passwd | awk -F: '
BEGIN {
printf ("3^2=%d\n",3^2) ;
}'
- Í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 meg az /etc/passwd fájlt úgy, hogy minden sort visszafelé íratsz ki!
cat /etc/passwd | 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
|