Az a. megoldás azt használja ki, hogy a megjelenítendõ sorok "d" beûvel kezdõdnek.
Mindkettõvel elérhetjük azt, hogy egy újabb névvel hivatkozhassunk egy már létezõ fájlra.
Az "ls -l" parancsban az alábbi módon látszanak az "index.htm" fájlhoz az
A hard link egy ellenõrzött, szoros kapcsolat, a fájl, amire linkeltünk, "tud róla, hogy hány egyenrangú neve van", csak egy fájlrendszeren belül,
csak fájokra hozható létre. Egy fizikai fájl, egy i-node tartozik hozzá.
A symbolic link egy laza kapcsolatot teremt, különbözõ
fájlrendszerek között is létrejöhet, directoryra is alkalmazható. A létrehozott pointer-fájl új i-node-ot jelent,
a létrehozott kapcsolat nem egyenrangú, elõfordulhat, hogy a link nem létezõ vagy számunkra nem elérhetõ fájlra mutat.
A válasz ettõl a "chmod"-tól nem függ. Ha a felhasználónak van "w" és "x" joga a fájlt
tartalmazó directoryra, akkor törölheti a fájlt, a fájlra vonatkozó jogaitól függetlenül.
A c. megoldás a leggyorsabb, de az "sh" shell nem tudja.
A b. megoldásnak az "i"-t növelõ utasítása az alábbiak valamelyike is lehetne:
A d. megoldásban az "echo x" jobb híján kell arra, hogy
legyen input fájlja az "awk"-nak. (Amitõl az awk program ciklusa teljesen független !)
Az e. megoldásban ez nem kell. (A BEGIN helyett END is szerepelhetne a sorban.)
Az a. és b. megoldások mindegyikének tekintettel kell lennie a "cut" parancs azon gyengeségére,
hogy az elhatárolójel pontosan egy helyköz. (Egy második helyköz már egy újabb "field".)
A c. megoldás a b.-nél egyszerûbb azért is, mert az "awk" számára
már "egy vagy több helyköz" az elhatárolójel.
Az a. megoldás összegzõ (s=`expr $s + $i`) utasításáról ugyanaz mondható el,
mint az 1.5 feladat b. megoldásának "i"-t növelõ utasításáról.
Az ilyen formájú input sorok feldolgozására a "cut" parancs "-c" opciója is szóbajöhet.
Azt használva nagyobb az esélye annak, hogy egy másik Unixban - ahol a sor egyes mezõinek esetleg nem ugyanaz a hossza - hibásan fut a parancs.
Az a. és b. megoldások mindegyikének a "sort | uniq -c | sort" a lényege, megelõzve egy olyan
programrésszel, ami a "hónap"-ot kivágja az inputból.
A c. megoldás az "awk"-nak azt a lehetõségét használja ki, hogy egy tömb (jelen esetben az x) indexe tetszõleges string (jelen esetben a hónap neve) lehet.
A tömbelemek értékeinek maximumát az "m" változóba, a hozzá tartozó hónapnevet (tömbindexet) a "ho" változóba teszi a program.
A d. megoldás a maximumkeresést külön menetben, a tömb felépítése után végzi el.
Azt akarom vele mutatni, hogyan lehet egy létrehozott "asszociatív tömb"-öt egy ciklusban feldolgozni.
Az a. megoldásban a "sed"-del helyettesítjük a "sor elejét", "sor végét" ill. a TAB jeleket a megfelelõ jelsorozatokkal.
(A BORDER keretezett html-táblázatot eredményez.)
A b. megoldásban kihasználjuk azt, hogy a TAB is automatikus elválasztójel az "awk" input sorban.
Az NF változó az aktuális sor elemeinek számát tartalmazza.
A "printf"-ben a "%s" egy változó tartalmának string formában történõ kiírását írja elõ.
A "\n" csinál html-táblázat-soronként új sort, ami nem okvetlenül szükséges.
Az a. megoldásban a "wc" parancs számolja meg a "grep" által talált sorokat,
a b. megoldásban a "grep" maga.
A megoldások a 2. feladatéhoz hasonlóak.
A b. megoldás arra mutat példát, hogy egy "awk" programrész feltételesen is végrehajtható, és a feltétel reguláris kifejezés is lehet.
(A /^From / feltétel "if"-ben is szerepelhetne, az elõzõ feladat c) megoldásáéhoz hasonló módon.)
Emellett az is látható, hogy egészen "cifra" stringek (pl. e-mail címek) is lehetnek tömbindexek az "awk"-ban.
A ${1:-$MAIL} hivatkozás a legrövidebb megoldás arra, hogy a hiányzó paramétert a
$MAIL értékével helyettesítsük. Hosszabban írva azt tehetnénk, hogy a
Milyen egyszerûbb megoldást javasolna ugyanerre a célra az elõbbi helyett ? A parancs-sorozat a billentyûzetrõl (standard inputról) olvas Ctrl+D-ig (fájl végéig),
és a beolvasottakat a $L/alma fájlba teszi. Helyettesíthetõ pl. az alábbi utasítással:
cat >$L/alma
A "cat" helyén sok egyéb szûrõ is állhatna.
(Pl. tr "" "", sed "", tail +1, awk "{print}", grep ".", stb.)
Az a. megoldás azért nem lehet egyszerûbben egy "case" elágazás, mert a "case" feltételeiben a "*" nem reguláris kifejezés része,
hanem a fájlnevekben szereplõ *-hoz hasonló "akárhány akármilyen jel" értékû "joker" karakter.
Fontos, hogy az utolsó sed-helyettesítés "legalább 2" betûbõl álló, "elejétõl a végéig mind betû"-t helyettesít "b"-vel.
A b. megoldás az elsõ jelet vizsgálja, aztán elhagyja és a maradékkal folytatja ugyanezt.
Végül aszerint ágazik el a program, hogy miféle jeleket találtunk összesen.
(Kihasználva azt, hogy amennyiben egy "case" ág végrehajtódik, a továbbiak feltétele már nem is lesz vizsgálva.)
Egy "csökkentett prioritással" végrehajtott "man" parancs hibaüzenetét látjuk a képernyõn, ami "2>xyz"-vel irányítható az "xyz" fájlba.
Elsõ rész
do
if [ -d $i ]
then ls -ld $i
fi
done
A b. és c. megoldások lényeges része az, hogy az "ls" parancs "-d" opciója letiltja a directory(k) belsejének listázását.
A c. megoldásban a "find" parancs "-prune" opciója ugyanezt teszi a "find" szintjén. (Nem gondolom azt, hogy valaki fejbõl tudja a "-prune" opciót, a c. megoldást inkább csak a zh. második részében képzelném el.)
Az a-c. megoldásból hiányzanak az esetleges "rejtett" directoryk, de ezek az "ls -l" listából is kimaradnak.
A d. - csak Linux alatt mûködõ - megoldás a rejtett directorykat is listázza.
Az e. megoldás - amiben a "find" belsõ parancsként hajtódik végre - ugyanezt tudja minden Unixban, de sokkal lassúbb is lehet, mert belemegy az aldirectory strukrúrába, de az abból kapott sorokat a grep kihagyja azon az alapon, hogy legalább két "/" jelet tartalmaznak.
ln index.ht index.htm
ln -s index.html index.htm
parancsokkal létrehozott fájlok:
-rw-r--r-- 2 csa users 6436 Nov 22 22:55 index.ht
-rw-r--r-- 2 csa users 6436 Nov 22 22:55 index.htm
lrwxrwxrwx 1 csa users 9 Sep 28 18:30 index.html -> index.htm
. saját i-node .. szülõ i-node
chmod 700 fontos_file
do
for j in 0 1 2 3 4 5 6 7 8 9
do
for k in 0 1 2 3 4 5 6 7 8 9
do
echo $i$j$k
done
done
done
while [ $i != 999 ]
do
i=`expr $i + 1`
echo $i
done
i=`echo $i+1 | bc`
i=`echo $i | awk '{print $0+1}'`
i=$(($i+1)) # csak "bash" és "ksh" esetén
i=$[$i+1] # csak "bash" esetén
Második rész
A "tar -tvf archiv_file" outputja az alábbi formájú:
-rw-r--r-- csa/users 6016 Nov 22 13:07 1998 index.htm
-rwxr-xr-x root/bin 7108 May 4 06:21 1994 mkfs.minix
for i in `sed "s/ */ /g" $1 | cut -d" " -f3`
do
s=`expr $s + $i`
done
echo $s
END {print m, ho}' $1
END {for (i in x) if (x[i]>m) {m=x[i];ho=i}
print m, ho}' $1
A "txt" fájl sorai a táblázat sorai, a sorokban az oszlopokoat tabulátorjel (9-es kódú karakter) választja el egymástól.
A html táblázat sorait "<TABLE>" tartalmú sor elõzi meg, "</TABLE>" tartalmú sor követi.
Minden sor "<TR><TD>" jelsorozattal kezdõdik, és "</TD></TR>" jelsorozattal zárul.
Soron belül az oszlopokat "</TD><TD>" jelsorozat választja el egymástól.
echo "<TABLE BORDER>"
sed "s/^/<TR><TD>/
s/$/<\/TR><\/TD>/
s/$TAB/<\/TD><TD>/g" $1
echo "</TABLE>"
{ printf "<TR><TD>"
for (i=1;i<NF;i++) printf "%s</TD><TD>", $i
printf "%s</TR></TD>\n", $NF
}
END {print "</TABLE>"}' $1
Minden levél egy olyan "From " kezdetû sorral indul, amit vagy egy üres sor
(BSD-Unix, Linux), vagy egy csak Ctrl+A-kat tartalmazó(AT&T-Unix) sor
(vagy semmilyen sor sem) elõz meg. Az ezzel kezdõdõ "levél fejléc" egy
üres sorig tart, azt követi a levél szövege.
Irjon parancsfájlt, ami a paraméterként adott levélfájlról megmondja, hogy
hány levél van benne. Azzal az egyszerûsítéssel oldja meg a feladatot, hogy minden levél
pontosan egy "From " kezdetû sort tartalmaz.
A c. megoldásban az "if" feltétele rövidebben ($1 == "From") is lehetne.
END {print m, ki_kuldi}' ${1:-$MAIL}
case $# in
0) PAR=$MAIL;;
*) PAR=$1;;
esac
elõkészítést követõen (mindkét megoldásban) a $PAR-t tennénk a ${1:-$MAIL} helyére.
rm $L/alma 2>/dev/null
while read alma
do
echo $alma >>$L/alma
done
csak számjegyeket tartalmaz
csak nagybetûket tartalmaz
csak kisbetûket tartalmaz
csak betûket tartalmaz, de kis és nagybetû(ke)t is
egyéb jeleket is tartalmaz
s/^[A-Z]*$/A/
s/^[a-z]*$/a/
s/^[0-9]*$/0/
s/^[a-zA-Z][a-zA-Z][a-zA-Z]*$/b/"`
case $KV in
A) echo nagybetuk;;
a) echo kisbetuk;;
b) echo betuk;;
0) echo szamjegyek;;
*) echo egyeb jelek;;
esac
P1=$1
while [ x$P1 != x ]
do
case $P1 in
[A-Z]*) NAGY=I;;
[a-z]*) KIS=I;;
[0-9]*) SZAM=I;;
*) EGYEB=I;;
esac
P1=`echo -n $P1 | tail +2c`
done
case ${NAGY}${KIS}${SZAM}$EGYEB in
INNN) echo nagybetu;;
NINN) echo kisbetu;;
IINN) echo betu;;
NNIN) echo szamjegyek;;
*) echo valami mas;;
esac
No manual entry for woman
Melyik parancs írja a képernyõre, és hogyan irányítható az "xyz" fájlba ?
Csizmazia Albert csa_a_valerie.inf.elte.hu Maulis Ádám maulis_a_ludens.elte.hu