- One mobilszolgáltatások
- Motorola Razr 60 Ultra - ez a kagyló könnyen megfő
- Google Pixel topik
- Android alkalmazások - szoftver kibeszélő topik
- Fotók, videók mobillal
- Poco F6 5G - Turbó Rudi
- Xiaomi 15 - kicsi telefon nagy energiával
- Xiaomi 13 - felnőni nehéz
- Mobil flották
- Amazfit Active 2 NFC - jó kör
Új hozzászólás Aktív témák
-
Jester01
veterán
válasz
VladimirR #219 üzenetére
A kettő között nincs jelentősebb különbség, talán a shell-es megoldás jobb, mert a bash jó eséllyel már a memóriában van. Jelen esetben persze nincs jelentősége.
Igazából a másodikat kellene átírni úgy, hogy a tail meg az egrep nem kell bele, mivel úgyis awk-t használsz. Az egrep amúgy mit is csinálna? És miért egrep? Pl. ez lehet egy megoldás:
pppstats ppp0 2>/dev/null | awk 'NR==2 { print ''down.value '' $1 ''\nup.value '' $7 }' -
Jester01
veterán
kivágni az adott nullát (18. karakter a sorban)
Konkrétan ezt így lehet:
line=`mdadm --detail /dev/md0 |grep Failed`
if [ ''${line:17:1}'' = ''0'' ]
then
echo ''minden ok md0''
else
echo ''raid hiba'' > /home/gd/Desktop/raid.txt
fi
Ha tudod pontosan mit ad vissza jó esetben, akkor célszerûbb egy-az-egyben azt ellenõrizni.
Egyébként pedig raid eszközöket az mdadm démon üzemmódjával lehet figyelni.
[Szerkesztve] -
Jester01
veterán
-
Jester01
veterán
válasz
Metalwarrior #196 üzenetére
Mondjuk soronként beolvasod a fájlt, majd a ${valtozo#minta} használatával megkeresed az összes elõfordulást.
-
Jester01
veterán
válasz
Tele von Zsinór #193 üzenetére
> echo ''foo/bar'' | sed 's/\//\\/g'
foo\bar
Részletesen:
s: parancs
/: paraméter elválasztó
\/: védett per karakter
/: paraméter elválasztó
\\: védett backslash karakter
/: paraméter elválasztó
g: parancs módosító
Amúgy sima karaktercserére a tr parancs való, vagy a bash beépített operátora:
> t=''foo/bar''
> echo ${t//\//\\}
foo\bar -
Jester01
veterán
válasz
Tele von Zsinór #192 üzenetére
Nekem kiválóan mûködik.
Ugyanakkor:
* A vagy operátort egy feltételen belül is használhatod:
if [[ ''$i'' -eq ''1'' || ''$i'' -eq ''3'' || ''$i'' -eq ''5'' || ''$i'' -eq ''7'' ]]
* Az eq az numerikus összehasonlítás, a számok köré felesleges az idézõjel.
* Az egészre sokkal egyszerûbb a párosságot vizsgálni:
if [[ $((i % 2)) -eq 1 ]]
then
feltolt_szokoz
else
feltolt_csillag
fi
* vagy vizsgálat nélkül:
for ((i=1; i<=7; i+=1))
do
feltolt_szokoz
i=$((i + 1))
feltolt_csillag
done -
Jester01
veterán
Én meg a #148-ban mutatott kóddal (persze az ütközést is ellenőrizve) betölteném egy tömbbe, és onnan az egész triviális.
-
Jester01
veterán
A 7es feladat egyetlen tr parancs, csak fel kell sorolni a leképezéseket.
tr ''abcdef .... xyzABCDEF ... XYZ'' ''nopqr ... klmNOPQR ... KLM''
(illetve ugyanez fordítva)
A 6/3 az bonyolult.
A 6/2 az ellenõrzés nélkül kb. ennyi:
x=$1
val=0
shift
while [ $# -gt 0 ]
do
val=$(( val * x + $1 ))
shift
done
echo $val
A 6/1 kb:
UCEN=$1
CH=${2:-28}
D=266
if jodatum ''$UCEN''
then
if [ $CH -lt 29 ]
then
D=$(( D + CH / 2 ))
else
D=$(( D + (CH*17)/30 ))
fi
date -d ''$UCEN + $D days'' +%Y-%m-%d
else
echo hiba
fi -
Jester01
veterán
válasz
loszerafin #143 üzenetére
Ugyanez bash shell script formájában:
for ((r=1; r<=8; r++))
do
for ((c=1; c<=8; c++))
do
if [[ $(( (r+c) % 2 )) == 0 ]]
then
TABLA[$((r * 8 + c))]='' ''
else
TABLA[$((r * 8 + c))]=''*''
fi
done
done
while read f c r
do
TABLA[$((r * 8 + c))]=''$f''
done
for ((r=1; r<=8; r++))
do
echo -n ''|''
for ((c=1; c<=8; c++))
do
echo -n ''${TABLA[r * 8 + c]}''
done
echo ''|''
done
Azt hiszem magától értetõdõ, leszámítva, hogy kevésbé olvasható.
Annyit fûznék még hozzá, hogy bash-ban nincs 2 dimenziós tömb (illetve asszociatív - az awk-ban ez van) ezért ki kellett lapítani egy dimenziósra a sakktáblát. -
Jester01
veterán
sh az alap. A ksh és a bash is felülről kompatibilis vele. A bash és a ksh normál használatban elvileg felcserélhető. Állítólag a bash a 88as ksh továbbfejlesztése (mármint tudásában), ugyanakkor a 93as ksh viszont további újításokat tartalmaz.
Természetesen semmi akadálya annak, hogy basht tegyél a bsdre, ha tulajdonképpen ez a kérdés. -
Jester01
veterán
Kérlek szépen a sima read-es változat az ennyi:
i=0
exec 3<&0
cat ''$1'' | while read line
do
echo ''$line''
if [ $((i++)) -eq 24 ]
then
read <&3
i=0
fi
done
A trükk amit említettem az exec-es sor. A fájlleíróknak linuxban számuk van. A 0,1,2 rendre az stdin, stdout és stderr. A többit arra használod amire akarod. A 3<&0 átirányítás azt jelenti, hogy a 0-ás bemeneti fájlleírót (ami ezek alapján akkor az stdin) duplikálja 3-as számúként.
A while ciklus a pipe miatt alshellben fog futni, aminek az stdin-je a cat stdout-jára van kötve ezért ''elveszik'' a szülõ shell stdin-je (a terminál). Viszont a 3-as számmal ez továbbra is elérhetõ. Vagyis a belsõ read-nek megmondjuk, hogy innen olvasson. (az az átirányítás technikailag azt jelenti, hogy a 3-ast ismét visszaduplikálja a 0-ásra, mivel a read onnan fog olvasni.)
Bonyolultan hangzik, de egyszerû. Remélem érthetõ voltam -
Jester01
veterán
Ez sajnos még mindig nem jó
Amit a wc-vel kapcsolatban írtam, azt nem vetted figyelembe.
A sor kiírás az if elé kell, hiszen azt mindig meg kell csinálni.
A head-bõl kimaradt a $ jel az i elõl, illetve a szoveg helyett $1 kell.
Az if-ben rossz helyen van a $ jel, helyesen if [ $x -lt 25 ] és kimaradt a then.
Az x=x+1 helyesen x=$((x+1))
A read elõtti fi az gondolom inkább egy else, és a fi a done elé való.
k=`wc -l ''$1'' | cut -d\ -f1`
x=1
for ((i=1;i<=k;i++))
do
head -n $i ''$1'' | tail -n 1 #ez tuti azt csinálja, h minden sort egyesével kiír.
if [ $x -lt 25 ]
then
x=$((x+1))
else
read
x=1
fi
done -
Jester01
veterán
Nézd meg ngabor2 szkriptjét, a wc sajnos gonosz módon kiírja a fájl nevét is. Szóval a sorszámoláshoz kell a cut is.
A ciklusban nyilván nem jó a $i -ge 2 feltétel (még akkor sem ha az ott tkp 24 akart lenni), hiszen így az első képernyő után már soronként várná az entert.
A for ciklusba a $[$HOSSZ + 1] helyett simán $HOSSZ + 1 kell (vagy egyszerűen i <= $HOSSZ ugye). A head után hiányzik a fájlnév ($1).
MOD: a szóközt tartalmazó fájlok helyes kezeléséhez a megfelelő helyeken idézőjelbe kell tenni a $1-et.
[Szerkesztve] -
-
Jester01
veterán
Ez így nem lesz jó, mert a belsõ ciklus mindig újrakezdi a fájl olvasását az elejérõl.
Szóval mindenképpen az a while read sor kell kívülre. Belül meg simán csak számolod a sorokat, és 24 után egy if segítségével vársz egy entert és nullázod a számlálót. Még lesz vele egy kis gubanc, mégpedig az, hogy az entert váró read is a már átirányított fájlból akar majd olvasni. Szóval azt meg vissza kell irányítani a terminálraEhhez célszerû elmenteni a ciklus elõtt az stdin fájlleíróját, és a belsõ readnek megadni. Olvasd el a man bash átirányításról szóló részét, különös tekintettel a fájlleirók másolására.
-
Jester01
veterán
Mert itt már a while-nak (illetve az azt futtató alshellnek) kell megadni az átirányítást.
while [ $COUNT -lt 2 ]
do
read sor
echo $sor
COUNT=$((COUNT+1))
done < $1
MOD: Illetve kezdők jobban szokták szeretni a cat $1 | while ... formát mert jobban átlátható. Viszont indít egy fölösleges cat processzt.
[Szerkesztve] -
Jester01
veterán
válasz
passenger #44 üzenetére
Most nem azért, de szerintem kicsit alulbecsülte a feladatot aki ezt kitalálta. Ugyanis felelõtlenül használja a mondat kifejezést, hiszen a felsorolt írásjelek nem biztos, hogy új mondatot kezdenek, még akkor sem ha utánuk esetleg nagybetû jön. (Mi van akkor, ha II. Józsefrõl beszélek? Ezt ismerje fel nekem shell scriptbõl ha tudja
)
Egyszerûsítésképpen vegyük azt az esetet, hogy sor nem kezdõdik írásjellel, és a felsorolt írásjelek bármennyi egymás utáni elõfordulása választja el a mondatokat.
Akkor az alábbi awk script talán mûködik:
BEGIN { FS=''[?!.]+''; }
{ mondatok += NF - 1; }
END { print mondatok; } -
Jester01
veterán
válasz
passenger #41 üzenetére
Ennek millió módja van, íme egy lehetõség:
IFS=$'\n'
who | grep -F ''$*''
Magyarázat: a ''$*'' helyére a shell az IFS speciális változóval elválasztva összefûzi a parancssorban megadott argumentumokat. A grep pedig a -F opció hatására újsorral elválasztott konstans mintákat vár. Ha az IFS-t elõzõleg az újsor karakterre állítjuk, máris a kívánt eredményt kapjuk.
Új hozzászólás Aktív témák
Hirdetés
- Eredeti Microsoft termékek - MEGA Akciók! Windows, Office Pro Plus, Project Pro, Visio Pro stb.
- ROBUX ÁRON ALUL - VÁSÁROLJ ROBLOX ROBUXOT MÉG MA, ELKÉPESZTŐ KEDVEZMÉNNYEL (Bármilyen platformra)
- Új, bontatlan World of Warcraft gyűjtői kiadások
- Adobe Előfizetések - Adobe Creative Cloud All Apps - 12 Hónap - NYÁRI AKCIÓ!
- Sea of Thieves Premium Edition és Egyéb Játékkulcsok.
- PS3 Játékok 1500Ft/db - RÉSZLETEK A LEÍRÁSBAN
- Veszünk: PS5 Fat/Slim/Digital/Pro konzolt, játékokat, Portalt stb. Kérj ajánlatot!
- Apple iPhone 14 128GB, Kártyafüggetlen, 1 Év Garanciával
- Csere-Beszámítás! Asztali számítógép játékra! I5 14400F / RX 6900 XT 16GB / 32GB DDR5 / 1TB SSD
- BESZÁMÍTÁS! Sony PlayStation 4 PRO 1TB SSD fekete játékkonzol extra játékokkal garanciával hibátlan
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest