rilpoint_mw113

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.
(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

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!
  • 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
Skin by RIL Partner