Shell script segítség

Sziasztok. Egy olyan kérdés lenne, hogy hogy lehetne megcsinálni ezt, hogy egy ilyen sorból (egy szövegfájl) "Kc6 D4 F2", ilyenből: "Kc6,D4,F2", meg ilyenből: "Kc6, D4 F2" kiszedni a szóközöket meg a vesszőket. Vagyis pontosabban nekem a karaktersorozatokra lenne szükségem külön külön. Pl a "Kc6"-ra, "D4"-re. A lényeg az, hogy ezeket vesszők vagy szóközök választják el, de azoknak bármilyen kombinációja is lehet, tehát több szóköz is akár, vagy csak szóköz, csak vessző.
Köszi a segítséget előre is

Üdv, Chapell

Hozzászólások

Azt ugyan nem mondtad meg hogy a vegen pontosan milyen formaban akarod latni a kimenetet, de kezdetnek ez segithet. Kicsit hosszu es maceras, biztos van egyszerubb is.

cat [file] | sed -e 's/ +/_/g' | tr -s "," "_" | cut -d "_" -f[oszlop szama]

Ezzel minden szokoz(akarhany) vagy vesszo elvalasztot lecserel
1db _jelre, majd
a 'cut'-nak megmondod hanyadik mezo kell, es azt fogja dobni.

szerintem...
---
PtR

tr -s ", " "\n\n"
Cserélhetsz persze 1-1 szóközre is.

excel-ben akarmilyen delimitert megadhatsz, pl vesszot _es_ szokozt is ;-)

Köszi a segítséget mindenkinek. gd megoldása lett a befutó, mivel az is a legegyszerűbb. Köszi mégegyszer a segítséget :)

Sziasztok,

nem értek sajna a shell scriptekhez, de írnom kellene egy olyat ami a következőt csinálja:

a paraméterként kapott könyvtárban található, "3" vagy "4" számjeggyel kezdődő fájlneveket a "marha" nevű fájlba írja, a fájlba írt fájlnevek számát pedig a "tehen" nevű fájlba.

Megköszönném ha segítenétek!

sziasztok

Haat, azert ez igy ebben a formaban nem teljesen igaz.


$ find $1 -maxdepth 1 -type f -name 3\* -o -name 4\* > marha
$ wc -l < marha > tehen

A te megoldasod csak 2 sebbol verzik: ha van egy 3-mal vagy 4-gyel kezdodo mappa, akkor az is bekerul a fajlba, illetve ebbol adodoan ha az illeto mappanak van tartalma, akkor az kerul be a fajlba es nem a mappa neve.
Ja, illetve a marha-ba szerintem csak egy szam kell.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

hello mindenki!
ha valki tudna nekem segteni azt nagyon megköszönném shell scritben.
a feladat ez lenne: Írjon shell scritet, amely két paramétert kap. Megvizsgálja, hogy az első paraméterben kapot nevű felhasználó bejelentkezett e. Ha igen, írjon a második paraméterba megadott nevű fájlba a nevét, és hogy "bejelentkezett".
előre is köszi

Valaki tudna segiteni?
irjon sc amely a kecsege,vidra,poszata,beka szavakat kaphatja.ha mas parametereket kap,,hibajelzest ad,egyebkent a hal,keteltu,emlos szavak valamelyiket irja a kepernyore?
Elore is koszi!!

na ja de itt a "kaphatja" szó, magyarán még olyan bonyolult dolgokat kell elvégezni, mint leellenőrizni, hogy van e paraméter a parancssorban, aztán ha nincs ( if [ -z $1 ]; then echo "nincsen parameter"; exit; fi ), utána meg még több ifel meg kellene nézni, hogy vajon a bemenet beka e (if [ $1 == "beka" ]; then echo "keteltu"; fi ). Egyébbként, meg ha nincs bent a négy közül valamelyikben a bemenő paraméter szintén error. És ez elismerheted nem könnyű. :)
A te példád ömlesztett adatokkal dolgozik.

Ja elegáncs nagyon, csak szerintem a vizsgán a standard input kezelésére és a test-re kiváncsi a tanár, mint egyszerű műveletekre. Úgyhogy ahogy írtad, eléggé kilógna a lóláb, ha beadná a srác a Te változatodat. Pláne ha még kis-nagybetű ellenőrzéssel is kiegészítenéd. :)
Bár a paraméterek adottak és ha mást adna be, akkor error. Legalábbis az én olvasatomban.

Szerintem nem kellene if minden kombinációra. Én az ilyen feladatokat case -el csináltam meg és [B|b]eka. ha jól emlékszem így.
De ki is próbálom rögtön :) A hibakezelést pedig én csak if-el tudom. Vagy van paraméter vagy nincs.

Szerk: én így csináltam volna

if test $# -ne "0";
then
    case $1 in
        Kecske|kecske)
            echo "emlos";
            ;;
        Vidra|vidra)
            echo "emlos";
            ;;
        Poszata|poszata)
            echo "madar";
            ;;
        Beka|beka)
            echo "keteltu";
            ;;
        *)
            echo "ERROR: a hasznalhato szavak: kecske, vidra, poszata, beka";
            ;;
esac
else
    echo "nincs parameter";
fi

Az egy dolog, hogy valaki jár körbe egy témát és elakad, kiteszi
az elakadásjelzőt és azt kérdi: van-e valaki, aki ugyanígy járt?

És egy másik dolog, hogy mással csináltatjuk meg a zh-nkat. Ezen
már egyetemista koromban is mindig kiakadtam.

Szóval ez itt így már feladatmegoldó nagyüzem.

> Sol omnibus lucet.

A tartószerkezet házi az úgy készül, hogy bementek egy házba
és tartjátok a szerkezetet? Vagy a szerkezet tart valamit?
Vagy a lány tart a szerkezettől? Sajnos a témában járatlan vagyok,
de lány az biztosan kell hozzá, ezen nem lehet vita (-::

> Sol omnibus lucet.

Na ja! :)
Ő tartja, aztán csűrünk-csavarunk, aztán majd kijövök belőle valahogy. :)

(Amúgy tartószerkezetek(hidak, tetőszerkezetek, rácsos tartók) nyírását csavarást kellett kiszámolni adott ponton jelentkező erőhatásokkal képletek és vektorok segítségével. Az egész nem ért volna semmit, ha nem lettek volna a lányok és a jutalom: vasalás, mosás, főzés, egyébb szolgáltatások. Ez utóbbi sajnos kimerült legtöbbször a számomra értelmetlen tantárgyak jegyzeteinek átadásával illetve azok egyéni feladatának megoldásával. Sajnos. :) Mér' van az, hogy legtöbbször a nagymellű istentelenül sexy lányok nem értik az épületszerkezettant? )

Sziasztok,

azért írok ide most, mert igaza van meditronak ez már tényleg egy feladatmegoldó nagyüzem. Szeretném kimenteni a nickemet. Csoportból kérdezték tőlem egy páran, hogy hol kaphatnak információt a shell-el kapcsolatban. Ajánlottam nekik a hup.hu-t. Fel is keresték, de nem tudtak valami miatt regelni. Én meg voltam olyan rendes, hogy engedtem belépni őket az én adataimmmal. Nem hittem, hogy ennyire nem tudják. Szóval örülök, hogy azért segítséget kaptak és remélem tanultak is belőle. Ha jól hallottam akkor 2-3-as jegyeket kaptak. De ennyi segítséggel jobbra számítana az ember, de mégse. Pedig ahogy végignéztem a válaszaitokat, abban nem lehet kétség. Tehát ez történt :)Lehet, hogy többet ilyen nem lesz.

további szép estét mindenkinek

Az elejen lehettel volna becsuletes, es mondtad volna, hogy oldjak meg. Az a gond, hogy 1) ha tanar olvassa, ki is talalhatja hogy te ki vagy valojaban, es siman megjarhatod 2) ha ez megvan, akkor az egesz csoport is meg fogja szivni. Szoval imadkozz.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Sziasztok!

Tudna valaki olyan linket adni, ahol shell script példák vannak. Nem a leg egyszerűbb feladatok kellenének, hanem egy fokkal összetettebb, bonyolultabb. (zh-ra felkészülni)
Keresőkben nem találtam, csak alap feladatokat.
(shell, bash)

Sziasztok!
Nem meglepő módon segítséget szeretnék kérni ahogyan azt előttem már többen is tették. Adott egy fiktív adat file aminek az első néhány sora a következőképpen néz ki:
1.,Balogh Elvira,hölgy,1988.06.02.,Sárospatak,85000
2.,Dudás Diána,hölgy,1967.03.16.,Simontornya,101000
3.,Kocsis Vince,úr,1936.10.28.,Várpalota,74000

Ilyesmi lekérdezéseket szeretnék csinálni

Melyik fizetés a leggyakoribb a Budapestiek körében?! Írassuk ki az egyes
fizetéseket, illetve a számukat két oszlopban egymás mellé, fizetés szerint növekvő
sorrendben. awk-val kéne megoldani

erre megoldás
sort -k6 -n -t, adat | awk -F, '($5 == "Budapest") { print $6 }' | uniq -c | awk '{ print $2" "$1 }'

1, A problémám az, hogy a megfogalmazásban az áll, hogy melyik a leggyakoribb keresztnév akkor nem tudom, hogy mitévő legyek, hiszen az ,-vel 6 oszlopra bontjuk a táblát és nem tudom, hogy tudnám rendezni csupán keresztnév szerint.

2, Továbbá ha hónap, csak hónap szerint szeretném rendezni és azokat megszámolni, akkor sem tudom mit tehetnék, a substr -gel le tudom csípni a dátum végét, de akkor megmarad az év, és az sem kéne nekem.

Továbbá lenne pár sed-del kapcsolatos kérdésem is. Ugyanezen az adat file-lal kell dolgozni de csak sed-del. Ha a ,-ket tab-ra kell cserélni az még megy ugye a sed s/,/|t/g -vel de sajnos megáll a tudományom ha olyanokat kéne csinálni mint:
3, azokat a sorokat törölje amelyikben a születési dátum 19.-e (vagy bármilyen más nap után) van
4, az úrakat tartalmazó sorokat duplán írja ki
5, az úrakat tartalmazó sorokat üres sorral helyettesíti
6, páratlan számú sorokat törli
7, valamelyik (mondjuk az első) oszlopot törli
8, az év második felében születettek sorát duplán írja ki
9, a hölgyeket tartalmazó sorok elé beszúr egy üres sort

Bármilyen segítségnek örülnék.

Minden jót!
Tommy

Üdv!

Egy routeren futó ip_conntrack táblájából (cat /proc/net/ip_conntrack) szeretném kigyűjtenyi, hogy melyik router mögötti IP hány kapcsolatot létesített a script futásának idején. Hogyan tudom ezt kiszűrni? (Esetleg van rá megfelelő célprogram?)

Petya

Üdv!

Próbálkozom:

for line in `cat /proc/net/ip_conntrack | awk '{print $1, $4, $5, $6}'`
do
....
done

Ez így nem jó, azt szeretném, hogy a for cikluson belül a line változóban az egész sort lássam, vagyis hogy a for ne a szóköznél, hanem a newline karakternél válassza el a lista elemeit. Megoldható ez?

Petya

Üdv!

#!/bin/bash

IFS="$'\n'"
for line in `cat /proc/net/ip_conntrack | awk '{print $1, $4, $5, $6}'`
do
echo $line
echo -------------------
done

Ennek elvileg minden conntrack sor után kellene kötőjeleket raknia, de csak az utolsó után rak.

Petya

szerk: IFS=$'\n', így már megy. Köszönöm!

Üdv!

Azt szeretném meghatározni, hogy melyik IP-ről hány kapcsolatot kezdeményeznek a routeren keresztül. A conntrack modult nem is használja egyébként ez a router, csak azért töltöttem be, hogy lehessen kimenő/bejövő kapcsolatszámot nézni. Eddig ezt kézzel csináltam, de jó lenne egy script ami az összes IP-re megadja a kapcsolatok számát. A conntrack tábla tartalmaza ezt az információt, azért gondoltam hogy ebből szedem ki valahogy. Ha van egyszerűbb megoldás, akkor kíváncsi vagyok rá :)

szerk: a konrkét kérdésben szereplő rész pedig azért kell, hogy kiszűrjem azokat a kapcsolatokat, amelyek mindkét "vége" az én subnetemben van, így nem megy át a routeren.

Petya

a zárójel sztem subshellt indít, a [ parancs már nem látja...

if [ ! ( ( `echo $src | cut -c-10` == "ip.sub.net") -a (`echo $dst | cut -c-10` == "ip.sub.net") ) ]

helyett

if [[ `echo $src | cut -c-10` != "ip.sub.net" || `echo $dst | cut -c-10` != "ip.sub.net" ]]

Helo!

Készítettem egy szkriptet ami kiszedi a mail logokból , hogy hány levelet dobozz vissza a spamhaus. Ezt napi bontásban elkészíti a következő formában: cat spam_statistic_2007_Aug.txt
2007 Aug. 1. spam: 246
2007 Aug. 2. spam: 927
2007 Aug. 3. spam: 362
2007 Aug. 4. spam: 103
[...] 31-ig
Minden hónapot külön file-ba, de ez mindegy.
Most össze akarom számolni, lehet, hogy nem jó módszerrel, de ez jutott eszembe. Programozni nemtudok, tehát nincs meg hozzá a megfelelő szemléletem :) Tehát így próbálkoztam:


#!/bin/bash

COUNTER="1"
SPAMSZAM="0"

while [ $COUNTER -le "31" ]; do
SPAM=`cat spam_statistic_2007_Aug.txt | grep "$COUNTER\." | awk '{print $5}'`; # ezzel kiszedem a számot a sorok végéből

SPAMSZAM=`expr $SPAMSZAM + $SPAM`; # ezzel van a gond

COUNTER=`expr $COUNTER + 1`; # ez jó, mert az előző sor nélkül nem volt hiba
done

echo "A spamok osszesen: $SPAMSZAM";

Hibajelenség:


 ./count.sh
expr: syntax error
expr: syntax error
expr: syntax error
expr: syntax error
expr: syntax error
expr: syntax error
expr: syntax error
expr: syntax error
expr: syntax error
A spamok osszesen: 8020

A poén, hogy jól számolta meg, mert ha akármelyik sorba egyel nagyobb számot írok, akkor az eredmény is egyel több. De akkor miért syntax error? És miért csak 9?

Bocsi, de akkor bemásolom az eredményt:


246 199 287 143       # a 256 az 1-ben, 199 a 10 és 11-ben a 287 a 21-ben  
a 143 a 31-ben van :S:S:S:S 
expr: syntax error
927 292 373
expr: syntax error
362 180 288
expr: syntax error
103 568 645
expr: syntax error
470 378 595
expr: syntax error
443 583 433
expr: syntax error
484 435 433
expr: syntax error
273 331 234
expr: syntax error
272 436 274
expr: syntax error
199
199
292
180
568
378
583
435
331
436
532
287
373
288
645
595
433
433
234
274
182
143
A spamok osszesen: 8020

igen, a helyes megoldás:

SPAM=`cat spam_statistic_2007_Aug.txt | grep " $COUNTER\." | awk '{print $5}'`;

Vagyis tettem egy szóközt a $COUNTER alá.
Igy ha a COUNTER ="1"
Akkor a grep így keres: " 1."
Ha 2 akkor: " 2."

Viszont most:
A spamok osszesen: 11600 :)
nah akkor számoljunk telóval is azért ...

Katasztrófa. No lássuk. Így néz ki a fájl:
===
2007 Aug. 1. spam: 246
2007 Aug. 2. spam: 927
2007 Aug. 3. spam: 362
2007 Aug. 4. spam: 103
[...] 31-ig
===

Azaz egy sor összesen áll 5 db szóközökkel, tabulátorokkal elválasztott adatból, amiből az utolsót kell összeadni. Feltételezem, hogy *csak* ez van a fájlban, így ahogy ideírtad.

a) Megoldás awk-kal


awk '{ a += $5 } ; END { print a } ' spamfile

b) feltétel ugyanez, de nem használok awk-t, csak a shell lehetőségeit:


osszdb=0
while read ev ho nap spam db
do
osszdb=$(( $osszdb + $db ))
echo $osszdb
done < spamfile | tail -1

(Ez a "ciklusban kiiratom, majd kiszűröm az utolsó sort" -baromság azért van, mert létezik egy elég sok shellben létező hiba, ami miatt a ciklus belsejében levő változó értékadás a cikluson kívül nem látszik (bár általában "ciklus pipe-ban" esetben jelentkezik, így jelen helyzetben felejthető, azaz elég a ciklus után 1 db kiíratás simán.)

c) ha van kedved, játszhatunk még, hogy rakok bele awk-t *is* , meg shell konstrukciókat *is*, esetleg egy kis grep-et *is* expr-rel megfejelve - de minek. (Ja, és ha a grep-nek adott mintában nem használsz semmi regexp-et, akkor ne eltakard a speciális jelentésű karaktert, hanem használj fgrep -et (POSIX-ül "grep -F" -et helyette, egyszerűbb, átláthatóbb a végeredmény.)

Ha nagyon szépen megkérsz, akár a te kódodból is lehet működő verziót barkácsolni, csak kicsit sok mindent akarsz használni. (Pl. ha van egy grep | awk valahol, akkor szinte biztos megoldható grep nélkül, lévén az awk is tud mintaillesztést. És í. t. No offense.)

Hmm, köszi :)
Mostmár nem megyek vissza, hogy megnézzem írtam e első hozzászólásomban, de ezt a szkriptet azért csináltam így, mert jelenlegi tudásommal ennyire futotta sajnos. Általában miután sikerült valamit "úgyahogy" megcsinálni, szoktam egyszerűsíteni ha tudom. (Pl kóstolgatom a PHP-t munka miatt, és egyszer megcsináltam egy sorbarendezést jó sok kódsorból, mire befejeztem rájöttem hogy lehet harmad annyi kódsorból ugyanazt megcsinálni :))

Ez nagyon tetszik,

awk '{ a += $5 } ; END { print a } ' spamfile

Engem minősít, hogy én ugyanezt milyen körülményesen csináltam meg :) De működik, és sikerült megcsinálnom a feladatom időre, egyelőre ez volt a legfontosabb.

"Ha nagyon szépen megkérsz, akár a te kódodból is lehet működő verziót barkácsolni, csak kicsit sok mindent akarsz használni."
NAGYON szépen megkérlek :), sőtt, ha van kedved (mert talán csak szemetelnénk ide a fórumba) megadom a skype nevem vagy mail cimem.

Thx / budacsik

Szerk.: egy régi problémám, hogy nem tudom megcsinálni azt, hogy pl van egy konfig fájl, amiben az van beállítva, hogy:

opcio1="ertek1"
opcio2="ertek2"
opcio3="ertek3"
opcio4="ertek4"

Tehát tipukus konfig fájl. Amit egy kis kérdez felelekkel (echo "...?";read VALASZ1;) tudnék kitölteni, változtatni. Ha eszembe jut konkrét eset majd megírom :)

Igen, írtad, hogy nem tudsz programozni, tehát nem szidtalak. A két rövidebb megoldást is azért írtam, hogy lásd, ha ismerjük jól a feladatot - és az eszközöket -, akkor könnyebb esetleg működő - és átlátható ! - kódot írni. (Elsőre nem is értettem a kódodat, így eltartott egy darabig, mire rájöttem, hogy mi a baj.)
Most nem érek rá (éppen shell használatot kell tanítanom :-) ), de igyekszem visszatérni a te megoldásodra, kicsit kivesézni és működő állapotba hozni.

2. probléma:
Marha egyszerű: van egy sablon, amiben az értékek helyén mondjuk '|' karakter van, meg van a konfig.
Behúzod az adatokat, bekéred az új adatokat read-del, majd:


cat template | \
sed -e "/opcio1=/s,\|,${opcio1}," \
    -e "/opcio2=/s,\|,${opcio2}," \
    -e "/opcio3=/s,\|,${opcio3}," > /etc/configfajl

amire nagyon oda kell figyelj, az az, hogy a standard sed parancssortól eltérően itt macskakörmök közé kell tenni az értéket, hogy a váltzó behelyettesítődjön. Ha aposztófok között lenne, nem helyettesítőne be.

Üdv.

Egy olyan problémám lenne, hogy adott egy sima text file. Ebben a fileban szeretnék egy sor ("egy megadott string") elé vagy mögé egy újabb sort beszúrni. Ez az adott sor ami elé vagy mögé _új sorba_ kellene beszúrni sehol máshol nem fordul elő a fájlban. Gondolom sed vagy awk kellene hozzá? De nem igazán jövök rá a titok nyitjára :)

Sziasztok!

Szeretnék segítséget kérni, mégpedig hogyan lehetne egy ilyen adatból?
___
A1:VIT ____. ( A B C )
B1:IGE ___ ( 1 VI Z )
C1:ZAJ ___ ( 2 I G A )
___________( 3 T E J )
____

a táblázatnak ugy kell kinézni mint a másodiknak. az első feésorolásnál a betű az oszlop a szám a sort jelenti a lényeg hogy alakitsa vissza az elsőből a másodikra a szkript... teljesen tanácstalan vagyok. elég ha csak valamilyen irányt adtok meg egy oldalt ahol összesítve megtalálom a shell hasznosabb érdekesebb parancsait. Elöre is köszönöm!

nem gondoltam hogy mással csináltatom meg, nagyon szeretnék tudni programozni a unixban megpersze másban is. Tisztában vagyok vele hogy egyedül kell végig csinálnom különben semmit nem fog érni :/Csak még kicsi az én tudásom ilyen nagy feladatokhoz, gyakorolnom kellene meg példákat látnom, talán jobban menne :)

van egy acces adatbázisom, csak ékezetes, mySQLbe konvertálva elcsesződiknek az ékezetek. sql-be exportáltam és az ékezetek elcsúsztak (%$ß |) sz@arak stb...

megvannak a karakterláncok pl: ő betű &#o ezeket hogy cseréljem ki o -ra?

--
Xiluka

cat fajl.text | sed s/"&#o"/"o"/g > out_fajl.text
Kicserélgeti a &#o karakterláncokat o ra.
cat fajl.text | sed s/"&#"/""/g > out_fajl_2.text
Kiszedi a &# karakterláncokat a fájlból
vagy
cat fajl.text | tr -d "#" | tr -d "&" >> out_fajl_3.text
Ez kiszedi a fájlból a kettőskereszteket és az "és" jeleket
--
unix -- több, mint kód. filozófia.
Life is feudal

Sziasztok!

Egy probléma megoldásában szeretnék segítséget kérni.

Adott egy elég nagy könyvtárstruktúra, melyben szétszórva következő formátumú file-ok vannak: foo.a00, foo.a01, foo.a02, stb..

Valahogyan egy adott könyvtárba kellene azokat a file-okat másolni, melyek csak kiterjesztésükben térnek el.

Tudtok esetleg valami megoldást javasolni?

Előre is köszi!

Tudod a unix több, mint kód, filozófálgass a find man oldalain ;P
Bocs nem bírtam kihagyni ;)

A parancs tutipontos, neked csak be kell helyettesítened a változókat, ennél jobban már nem tudom a szádba adni:

fifi@blackdragon:~$ ls -l *.jpg
-rw-r--r-- 1 fifi fifi   5153 2006-09-28 19:31 FifiTheReal.jpg
-rw----r-- 1 fifi fifi  27039 2007-10-16 17:03 Image(034).jpg
-rw----r-- 1 fifi fifi  18687 2007-10-16 17:04 Image(035).jpg
-rw-r--r-- 1 fifi fifi 176035 2007-08-11 09:26 sensors-2.6.21.1.jpg
fifi@blackdragon:~$ ls -l tutijo
ls: tutijo: No such file or directory
fifi@blackdragon:~$ mkdir tutijo
fifi@blackdragon:~$ find . -maxdepth 1 -name "*.jpg" -exec cp {} tutijo \;
fifi@blackdragon:~$ ls -l tutijo
total 228
-rw-r--r-- 1 fifi fifi   5153 2007-11-27 21:03 FifiTheReal.jpg
-rw----r-- 1 fifi fifi  27039 2007-11-27 21:03 Image(034).jpg
-rw----r-- 1 fifi fifi  18687 2007-11-27 21:03 Image(035).jpg
-rw-r--r-- 1 fifi fifi 176035 2007-11-27 21:03 sensors-2.6.21.1.jpg
fifi@blackdragon:~$

Bye, Fifi

Szerk.: Persze ha vannak "elfajzott" filenevek, akkor nem árt a cp után a "{}" használata inkább.

AHONNAN alatt alkönyvtárak is vannak és mindenfelé véletlenszerűen előállított fájlokat tettem, amelyeknek proba.valamilyen kiterjesztés, vagy csak simán proba volt a nevük kiterjesztés nélkül. Ezeken kívül sok egyéb állomány is volt az alkönyvtárakban véletlenszerűen.

find ./AHONNAN/ -name "amikellfile*" | xargs cp -t ./AHOVA

Csupán a cp -t kapcsolója kellett nekem, köszönöm!
Persze a megtalált azonos nevű fájlokat nem írogatja felül...

--
unix -- több, mint kód. filozófia.
Life is feudal

Csak hogy még egy ötlet legyen a többi jó mellett :) :


for i in $(find -name foo.*); do cp $i <cél>; done

én így csinálnám...

[szerk]: bocs, rossz helyre válaszoltam... kt0m -nek akartam válaszolni.
Elnéztem :)
---
PtR

Lásd ch kolléga előző megjegyzését, kiegészítve azzal, hogy az xargs-nak simán meg tudod mondani, hogy hány argumentumot pakolhat max. a parancs argumentum-listájába ('-n' kapcsoló), ill. max. hány karakter hosszú parancssort pakolhat össze ('-s' kapcsoló), valamint még számos egyéb hasznos cuccot is (az én kedvenceim: -P, -r), illetve a szóközös file-nevek helyes kezelésére ajánlanám a find-nak a '-print0'-ját kombinálni az xargs '-0'-jával.

hali,

van egy stringem, benne ismeretlen számú (de mondjuk max 10) szóval. Az utolsó 2 v. 3 szót kellene tudnom kiírni.

mivel tudom ezt megcsinálni?

A szavakat elválasztó "delimiter" függvényében cut parancs, netán awk...
STRING="elsoszo#masodikszo#harmadikszo#negyedikszo#otodikszo"
ebben az esetben lehet
cut -d "#" -f4-5
-d az elválasztó karakter meghatározására jó.
-f4-5 azt jelenti, hogy adja ki a 4.-től 5.-ig a mezőket (field)
Ha az elválasztó karakter szóköz, akkor
STRING="elsoszo masodikszo harmadikszo negyedikszo otodikszo"
cut -f4-5
pölö.
De ebből:
STRING="elsoszo#masodikszo#harmadikszo#negyedikszo#otodikszo"
ezt
STRING="elsoszo masodikszo harmadikszo negyedikszo otodikszo"
legyárthatod a tr parancs segítségével is.
STRING2=`echo $STRING| tr "# " "`
(Asszem a tr parancsnak megadhatod bemenetként a STRING-et echo nélkül, de akkor más a forma és kacsacsőr alkalmazása szükséges.)
Fejből, nem biztos, hogy jól emléxem:
tr "#" " " < $STRING
Ha STRING egy és tíz szó között tartalmazhat szóközzel elválasztott szavakat, akkor awk egy lehetséges alkalmazása:
ELSO=`echo $STRING | awk '{ print $1}'`
MASODIK=`echo $STRING | awk '{ print $2}'`
HARMAS=`echo $STRING | awk '{ print $3}'`
NEGY=`echo $STRING | awk '{ print $4}'`
OT=`echo $STRING | awk '{ print $5}'`
HAT=`echo $STRING | awk '{ print $6}'`
HET=`echo $STRING | awk '{ print $7}'`
NYOC=`echo $STRING | awk '{ print $8}'`
KIL=`echo $STRING | awk '{ print $9}'`
T=`echo $STRING | awk '{ print $10}'`
Itt szintén lehet echo nélküli formát találni, de ezt most hagynám :D
Innen kezdve csak figyelteted, hogy $T üressztring-e, $KIL üresssztring-e és a többi
Ami nem üres sztring (visszafele haladva) onnan a kettő vagy három nem üres sztringet kiíratod...

--
unix -- több, mint kód. filozófia.
Life is feudal

És akkor Bash esetében lehet játszani a tömbökkel is (ezt akkor érdemes használni, ha a space nem szeparátor, hanem a keresendő szövegek része):


SEP="#"
TOMB=( "" )
TOMB[0]=$(echo ${STRING} | awk -F ${SEP} '{ print $1}')
TOMB[1]=$(echo ${STRING} | awk -F ${SEP} '{ print $2}')
TOMB[2]=$(echo ${STRING} | awk -F ${SEP} '{ print $3}')
TOMB[3]=$(echo ${STRING} | awk -F ${SEP} '{ print $4}')
TOMB[4]=$(echo ${STRING} | awk -F ${SEP} '{ print $5}')
TOMB[5]=$(echo ${STRING} | awk -F ${SEP} '{ print $6}')
TOMB[6]=$(echo ${STRING} | awk -F ${SEP} '{ print $7}')
TOMB[7]=$(echo ${STRING} | awk -F ${SEP} '{ print $8}')
TOMB[8]=$(echo ${STRING} | awk -F ${SEP} '{ print $9}')
TOMB[9]=$(echo ${STRING} | awk -F ${SEP} '{ print $10}')

Egy kicsit csaltam a szintaxissal... :) Így szebb...

Ha space a szeparátor, erre az egészre nincs szükség (ekkor a space csak mező szeparátor lehet):


TOMB=( ${STRING} )

Innentől viszont szépen lehet iterálni a tömb elemein.
Hint: sima indexes iteráció visszafelé:


for x in $(seq 0 ${#TOMB[@]} | sort -nr); do
   # Valami kod
done

Először a második kódra reagálnék. Ez előre fele iterálás, én visszafele iterálást írtam direkt, mert a feladat vmi olyasmi, hogy nézzük meg, mi az utolsó amiben még van valami, ehhez visszafele iterálás kell nem pedig előre iterálás.

Az első kód: Az a sed túl azon hogy hibás de felesleges is, az awk script yól hangzik, ide akár integrálható is lenne az a sed, bár nem látom, mit akarsz vele elérni. Az awk script bevehető lenne egyetlen nagy $( ) jelek közé, és megúszható lenne a külön file használatának elkerülése, hiszen egy ilyen feladatért sztem felesleges.

A másodkhoz:

visszafele (1-től tömbhosszig indexelve, vagy pedig 1-gyel elcsúsztatva kell ezt:)

for ((i=${#TOMB[@]}; i!=0; --i))
do
# $i felhasználása
done

A sed vagy tr ahhoz kell, hogy az idézőjeleket is kigyilkolja (simán csak általános kódot írtam :))

A tempfile most tényleg nem kell, akkor használtam így, amikor tényleg szükség volt az indexek meghatározására is az
awk-n belül. Az egyik progkör beadandó volt ilyen :D

Sziasztok!

Nem akartam a kerdesemnek uj temat nyitni. Van egy olyan problemam, hogy van egy bemeneti fajl, ami kb. igy nez ki:

00001234 bla-bla
00003213 bla-bla
12332141 bla-bla
36363621 bla-bla
44444444 bla-bla
67867768 bla-bla

Az elso oszlop gyakorlatilag egy timestamp. Ebben kellene valahogy ugy greppelnem, hogy pl. a 21343001 es 45000000 intervallumot kellene kiiratnom.
awk /regexp/,/regexp/ - fele megoldasban gondolkodom, de azzal az a baj, hogy a kezdeti es vegso intervallum lehet olyan, ami nem szerepel egyaltalan a logban, tehat valahogy kellene trukkozni a regularis kifejezessel, h. valamire mindenkeppen matcheljen.

Ha volna valami hatekony otletetek erre, akkor azt megkoszonnem.

Sziasztok!

(Számomra) Kölönös problémám van.
A lenti szkript hibat dob:

./db_backup.sh: line 5: date: command not found
./db_backup.sh: line 5: date: command not found

Az a kulönös, hogy a DATUM szeru sort sok szkriptben hasznalom, és ha nem függvénybe teszem akkor működik. De azért kell ide tennem, hogy valós legyen az indulási és befejezési idő is.

Ha a két db_backup meghívás elé teszem akkor is ez a hiba :(
De jobb szretném ha függvénybe menne. Egyébként lehet én bénázom el, mert ezt csak gyakorlás kép csinálom és tesztelgetek...


#!/bin/bash

function backupLog()
{
DATUM=`date '+%Y-%m-%d %H:%M:%S'`
echo "$1 db_backup $DATUM" >> $LOG
}

function db_backup()
{
$MYSQLDUMP -u $1 -p $2 --password=$3 > ${PATH}${DATE}_$1.sql 2>> $LOG
}

function savedCheck()
{
if test -f "${PATH}${DATE}_$1.sql"
then
echo "$1 save .......................................... OK!" >> $LOG
else
echo "ERROR: $1 db was not saved! " >> $LOG
fi
return
}

DATE=`date -I`
LOG="/var/log/db_backup.log"
PATH="/home/backup/database/"
MYSQLDUMP="/usr/bin/mysqldump"
DB1="db1name"
DB1_PASS="db1pass"
DB1_USER="db1user"
DB2="db2name"
DB2_PASS="db2pass"
DB2_USER="db2user"

# ---- MAIN Program ----
# ----- start log ------
backupLog Start

# ------- backup -------
db_backup $DB1_USER $DB1 $DB1_PASS
savedCheck $DB1

db_backup $DB2_USER $DB2 $DB2_PASS
savedCheck $DB2

# ------ end log -------
backupLog Stop

-
budacsik

Szia Mindenki!

Szeretnék segítséget kérni:

Debian etch stable rendszeren futtatok egy ftp szervert. (vsftpd)
A kliens (csak egy van) a ./home/cnc/ könyvtárba pakol, azt látja olvassa írja.
Írtam egy shell scriptet, (jogosultságokat változtat biztonsági másol meg még pár dolog amit csinál)

A Problémám: Hogyan lehet megtanítani a rendszernek hogy, amikor bármi változás történik a fenti könyvtárban (fájlok törlése, írása, módosítása), akkor fusson le a scriptem.

Köszönöm az ötleteket, segítségeket előre is.
_________________________________
http://ro.4242.hu
http://ro.4242.hu/strong_lite

Másik irányból: a vsftp-nek nincs ilyesmi 'plugin'-je? Hogy pl. logout-kor vagy file változáskor futtasson ezt v. azt? Lehet, hogy úgy könnyebb lenne.

A te irányodból:
http://linux.about.com/cs/linux101/g/fam.htm
http://www.linuxdevcenter.com/pub/a/linux/2004/12/16/fam.html

A tisztesség kedvéért hozzátenném, hogy sosem használtam még.

Módszer: A kliens kap egy könyvtárat, amibe írhat. Egy daemon figyeli a könyvtárat, hogy került-e bele fájl (creat()). Ha igen, akkor megnézi, ki írja a fájlt, majd open(), és meglepetésként unlink().
Amikor az, aki írja a fájlt kilép, akkor a még nyitott fájlt bemásolja egy másik könyvtárban létrehozott, a kliens által már nem látható fájlba.

De mielőtt megijednél a dologtól...: http://oss.sgi.com/projects/fam/

proftpd-t ismerem, az logol rendesen, minden fájl feltöltésekor, letöltésekor, stb. Létrehozok egy pipe-ot (lásd: mkfifo parancs), majd ráállítom a pipe-ra a log-ot.

Majd a scriptből:

while true; do
log="`head pipe_file -n 1'"
scripted, ami még felhasználhatja a $log értékét is
done

Előny: nem visz el felesleges proci időt, csak akkor indul, ha történt változás.

Sziasztok ismét!

Újabb kérdésem lenne:
Van-e arra valami hatékony módszer hogy bizonyos feltétel esetén egy script kicseréli egy fájl adott sorának adott karaktereit? Történetesen egy szövegfájl második sorának első öt karakterét. A fájl többi része, tartalma ne változzon.

Ismét köszi előre is a válaszokat :-)
_________________________________
http://ro.4242.hu
http://ro.4242.hu/strong_lite

Nekem a kerdezo elozo kerdesebol nyilvanvalova valt, hogy o nem hazit akar megoldatni.
A sed meg rengeteget tud, es -bar a -e 's/.../.../g' funkciojat rengetegszer hasznalom, alig ismerem. Ugyanugy, ahogy a dc is sokat tud, az emberek megsem hasznaljak ki a tudasanak toredeket sem.
Nem art, ha van ilyen pelda is a HUP-on. Szerintem.
(No offence.)

----
Sooner or later you had to talk, even if it was only because you'd run out of things to throw. - Pratchett
honlap készítés

Sziasztok!

Van egy text file-om, aminek a sorai ilyen szerkezetűek:

57,344 B 2006.02.18 05:18:03 /data/x/y/valamifile.dat 2016.02.16 Valtozo hosszusagu description RetInit:STARTED ObjHeld:NO

Ebben a 7. mezőtől (mezőelválasztó default egy vagy több szóköz vagy tab) kezdődik egy változó hosszúságú description mező, ami a RetInit szóig tart (pontosabban ez előtte levő whitespace-ig). Ezt a description-t szeretném egy változóba kinyerni.

Van erre valami ötletetek?

Köszi!
roadrunner

Első kör: az elejét lecsapni (cut (7-nagyonsokig, bár ez randa), utána meg (ha a "RetInit:"-et nem tartalmazza a description) a "RetInit:.*$" cseréje a nagy büdös semmire.
Második nekiugrásból awk-ban csinálnék ciklust 7-től a "RetInit:"-re maccsoló mezőig vagy NF-ig, a ciklusmagban printf az i-edi mező tartalma plusz egy space, a ciklus végén meg egy soremelést kinyomni.
Vagy sed-del bűvészkedés :-P

Sziasztok!

Nemrég kezdtem awk-t nézegetni (példákon keresztül) és nem tudom megérteni, hogyan és mikor lesz vége egy scriptnek (pl hogyan jut el az END-ig, amit ugye egyszer hajt végre, a legvégén).
Például van egy ilyen kódrészletem, hogy:

awk 'BEGIN {c=7}
{
for (i=0;i<4;++i)
{
print "abcdef"
}
}
END {print "ghijk"}

hogyan juthatok el itt a script legvégére, azon kívül, hogy ctrl+d?
előre is köszi a segítséget (és elnézést ha butaságot kérdeztem)!

Az awk script minta - tevékenység párokból áll össze, az adott mintára illeszkedő bemenő soron végrehajtja a mintánál szereplő tevékenységet. A "BEGIN" speciális mintánál megadott tevékenységet az első beérkező sor feldolgozásaelőtt, az "END" speciális mintánál szereplőt az utolsó beérkezett sor feldolgozása után végzi el.
Fentiekből egyenesen következik, hogy az "END" mintához tartozó tevékenységet akkor fogja végrehajtani, ha az input utolsó sora is feldolgozásra került, azaz a fájlt végigolvasta. Ha az input a standard bemenet, akkor ott a ctrl+D jelzi a bemenet végét.

RTM: http://www.computer-books.us/awk_4.php illetve Dale Dougherty: Sed & awk című könyve (O'reilly, Sebastopol, több kiadás) is nagyon hasznos olvasmány.

Sziasztok!

Kellene nekem egy kis segítség egy egyszerű shell script megírásához. Próbáltam magamtól de sajna nem ismerem ezt a nyelvet így nem igazán akar összejönni.

A lényeg annyi lenne:

Hogy van 2 fájlunk, egy letolt.sh és egy ido.

Na már a letolt.sh be van rakva a munkamenetek közzé így minden induláskor lefut. Én viszont azt szeretném ha egy nap csak egyszer futna le. Majd mentse el a dátumot az ido fájlba. Újabb indításkor pedig ellenőrizze, hogy a dátum egyezik-e a maival ha igen akkor álljon le, ha nem akkor folytassa a fájlt. Próbálom leírni az algoritmusát, hátha abból jobban érthető:

a letolt.sh tartalma:

Visszaolvassa az ido fájlból a dátumot;

Ha ido_fajlbol_kiolvasott_datum = mai_datum
{
lépjen ki
}
ellenkező esetben
{
itt fog lefutni egy parancs
mentse el az aktuális dátumot az ido fájlba
}

Remélem érhető és tudtok segíteni.

Üdv a következő biztonsági mentés szkriptet agyaltam ki:

I. mentés készítés az aktuális dátummal a /home/mentes könyvtárba (tar -jcvf /home/mentes/aktuálsi_dátum+'-1'+.tar.gz /public)

A.
Ha monden OK.
1. USB kulcs formázás/törlés
2. USB kulcsra átmásolás a /home/mentes/aktuális_dátum.tar.gz -t

B.
Ha nem sikerül a mentés
1. aktuális dátum -1 nap kivételével az összes /home/mentes/ mappában található fájlok törlése
2. go to I. (talán végtelen ciklus gyanús)

A script corontabbal lenne lefuttatva naponta.
Idő/dátum szinkrnizálás neten keresztül menne.

valami méretkorlát is kellene pl 4GB

kb ennyi...
valami észrevételetek van e? biztonságos? megvalósítható? további javaslatok? lehetséges hibák?

vagy van valakinek hasonló erre a célra felhasználható megbízható szkriptje?

üdv xilu

Persze, hogy megvalosithato
Szerintem igen sokan hasznalnak hasonlot.Bar szerintem a USB kulcsos megoldas egy kicsit rizikos. Mivel ha az usb kulcs tularamot kap ez alaplapon keresztul akkor bukta az egesz menetes.
Szeritem a jo megoldas a CD/DVD megoldas vagy dat kazis.
Az egesz kb 10-15 sorbol megolhato...

Kezd el irogatni es ha elakadsz akkor biztos segitunk neked.

van egy screenshotolt szkript, de más szellemi tulajdonát végső esetben használnám...
ha már az én szellemi tudásom nem elég :D

amugy valóban DVD lenne a legjobb, de a rendszer adott
de kliens gépekről valóban nem árt heti/havi DVD mentés...

a fentiek alapján a szkriptírás folyamtaban... tesztelés lesz húzós... és időigényes
nem vagyok programozo, de javabol átmentem 2esel :P ha van valami írok néktek!

üdv xilu

#!/bin/bash
MENTES=/home/backup/backup_$(date +%Y%m%d).tar.gz
MENTENDO="/public/"
echo "mentés folyamatban $MENTENDO -ből $MENTES -be"
tar -jcvf $MENTES $MENTENDO
if [ $? == 0 || > 4GB ]; then
echo "A következo fajl:"
echo $MENTES
echo " A "
echo $MENTENDO
echo " allomanybol készult"
else
echo "Problema lepett fel a kovetkezo:"
echo $MENTES
echo " fajl mentese soran ami a: "
echo $MENTENDO
echo "fajlt mentene"
(finish)

onmagaban a mento script:
egy kérdés hogy állomány méretet hogyan mivel tudok megvizsgálni?
if [ $? == 0 || > 4GB ]; then >>> 4 GB miatt nem fut le, de szintaktikailag helyes :D

erre épülne rá a kiirás USBre vagy épp /home/backup ürítés...

ma ennyire futotta...

if [ $? == 0 || > 4GB ];

Helyesnek azert helyes mivel $? a tar vegeredmenyet vizsgalja ami ha sikerul akkor egy 0 erteket ad vissza. Viszont a >4GB azt nem igy kene vizsgalni. Gondolom a file meretere vagy kivancsi ;)
A file meretet a kovetkezo kifejezessel tudod kiiratni/vizsgalni:
ls -l $MENTES|awk'{print $5}' es ezt mar bekerulhet az if-be ;)
Meg szerintem a || jel helyett && jel kell

Bar en kulon if-ben vizsgalnam ;)

Itt ugye egy cut indul az awk helyett, ráadásul a gawk-s megoldást minek if-be rakni? Van néki szép, egészséges exit statement-je: http://www.gnu.org/manual/gawk/html_node/Exit-Statement.html, azaz awk ... && foo illetve awk ... || foo is használható -- egy test hívás megspórolva.

Sziasztok!

Van egy nagyméretű (~300 MB) text fájl, ami fájlokról tartalmaz infókat, többek között a fájlok nevét is. Egy szkript egy ellenőrzés során ebben a listában nézné meg, hogy az adott fájlnév szerepel-e. A méret miatt a grep már elég lassú, és elég erőforráspazarló megoldás, mivel az minden keresés alkalmával a teljes fájlt át kell nézie.

Igazából csak annyira van szükség, hogy megmondja, a fájl szerepel-e a listában, vagy nem (találatok száma, stb. nem érdekes).

Mi lenne a leghatékonyabb (és legkönnyebben kivitelezhető) megoldás a keresés meggyorsítására? Betölteni valamilyen adatbázisba, ahol lehet indexelni adott mezőre, és SQL select-tel lekérdezni, vagy a rendezett listában (sort-tal is megoldható) C program segítéségvel keresni (biztos van rá kész megoldás)??

En biztos betennem SQL ala, a RDBMS-eket pont erre talaltak fel. De te nem en vagy.

Szoval, a legjobb megildas az RDBMS, mert az pont ilyenekre van kitalalva, optimalva, hogy keressen.

Ha ez valamiert nem kivitelezheto, akkor a C program jo megoldas, csak nem sokkal lesz gyorsabb az egesz, mert ugyanugy maszkalnod kell a fajlban, es ha a fajlnev nem ad tampontot a db-ben elfoglalt helyere, akkor gyak. ugyanott vagy, mint greppel.

Amit meg esetleg lehet tenni, hogy vagy a fajl valtozasara tett triggerrel, vagy a fajl meretet pollozva erzekelni a fajl modositasat, es olyankor automatikusan kigeneralni a fajlneveket egy kulon gyorscache-ba. Ez azert hatekonyabb a grep-nel, mert nincs koltseges regex matching (az osszes fajlnevet szeretnenk), igy kevesebb ido alatt megy ki a cucc.

Ez utobbi modszer azt feltetelezi, hogy a fajlod igen hasonlo egy CSV fajlhoz, vagyis hogy egy tablazat, amiben vannak oszlopok (mezok), es vannak sorok, a mezok kozt meg mezoszeparator karakterek. Ha nem, es valami emberi olvasasra szant cuccbol kell kiszedegetni a fajlinfokat, az eleg ciki, es raadasul ez a modszer sem a legjobb.

Ami az SQL megoldast illeti: Ha ez a fajl dinamikusan valtozik, es de szabott formatumu, akkor erdemes a logfajlbol pipe-t csinalni, es egy kis C daemonkat irni, ami a pipe-n figyel, ha van aktivitas, akkor bekuldi a SQL-be.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

Sziasztok!

A következő problémám van:
Adott egy UTF-8-es kódolású text fájl amibe html Unicode-os decimális karakterek is vannak pl:
#&945;
Tudja valaki, hogyan lehetne ezeket valódi UTF-8-as karakterekre cserélni?

"Recodes the HTML file using a new character set, while losing no characters at all. You can recode shift_jis to euc-jp, utf8 to latin1, iso-8859-15 to GB18030, iso-2022-jp to koi8-r etc if you wish, and none of the characters on the page will become unreadable (unless you specify -l switch, which disables making &#nnnn; escapes)."

http://bisqwit.iki.fi/source/htmlrecode.html

Kicsit kínlódás, de pár perc alatt megvan: sed-del cseréld ki az összes előfordulást. Szerintem hamarabb végzel, mintha célszoftvert keresel hozzá. Lesz egy szép hosszú sorod, amivel utána bármit át tudsz kovertálni.

(Ha kell segítünk a sed használatában. Illetve pár perc, ha elküldöd a fájlt megírom neked.)

Köszi, valami ilyesmire gondoltam először is inkább, ezért írtam ide :-). De van egy kis problémám:
az OS ISO8859-2 kódolást használ és fenti alfát takaró html kódot így jeleníti meg: Îą.
Elég macerásnak tünik így írni scriptet, arabtól - görögig sokminden van a fájlokban, és két napom rámenne mire elöállítanám a megfeleltetéseket. Ehelyett inkább az jutott eszembe, hogy hexában vagy oktában kellene megoldani a problémát. Pl: od-vel txt fájllá alakítani az adatokat, majd sed-del azt megszerkeszteni, majd visszaalakítani. Ez az elképzelésem nagyjából ott bukott meg eddig, hogy akárhogy próbálkozom nem tudom visszaalakítani normálisan a fájlokat.

Végül ez lett.

Kicsit féltem tőle mert nem értek a programozáshoz de 2 óra alatt összehoztam C-ben és a Postgre olvassa is rendesen. Már csak a megfeleltetési táblára van szűkségem, amihez az adatokat már le is töltöttem. Annyi kérdésem lenne még, hogy szerintetek milyen módszerrel keressem ki az összetartozó adatokat. Vagyis a programom ad egy sztinget amiben a html kód van, majd a megfelelő helyre beilleszti ennek a UTF-8 decimális értékéből kialakított karaktert. Pl:
945 -> 206 177

Ti milyen formátumban tárolnátok a megfeleltetéseket? Pl. CSV fájlban amit beolvasok? Ha igen akkor soronként olvassam be amíg nincs meg a html kód? Vagy egyszerre töltsem be a memóriába? Vagy ne külső fájlként legyen definiálva? Stb. A cél az lenne, hogy minél gyorsabban megtalálja a program a megfelelő decimális kódot.

Sziasztok!

Van egy pici script, ami percenként lefut a cron által,
azt kellene megcsinálni, hogy az eredmény ne külön egyperces fálj-ok legyenek, hanem 5 perces bontásban készüljenek a fájlok, de a letöltés wget-el mindenképp percenként kellene.

itt amit eddig fabrikáltam,

#!/bin/bash
filename="$(date +%F_%H-%M).txt"
cd /home/user/adatok/
wget http://www.valahol.hu/egyeb/adat.txt
mv /home/user/adatok/adat.cgi /home/user/adatok/$filename

Tehát percenként szedje le a megadott állományt, de ne percenkénti állományokat
hozzon létre, hanem ötperces egyesítéseket csináljon.

Most egy könyvtárba teszi az összes fájlt, ilyen nevekkel:
2008-08-06_01-35.txt, 2008-08-06_01-36.txt, 2008-08-06_01-37.txt, ...

Amit még jó lenne, ha abban a formában pakolná le a fájlokat, hogy
külön kövtárat hozzon létre a dátumoknak, méghozzá egymásba ágyazva,
tehát pl:
-2008
-Augusztus
-06
és itt lehetne a fájlok neve az óra, perc formátum, de ugye 5 percesekké kellene
olvasztani a perceseket.

Ha valaki leírná hogyan kell, nagyon örülnék.
Köszi

Köszi, egy kis részét értem, de még nem teljesen tiszta, hogyan is kellene tennem.

Meghagyom az eredeti scriptemet egypercenként lefutni (persze hozzáírva a fájlnévhez az %s -t). és amit írtál, az egy újabb script része lenne,
vagy pedig egy script lenne, ami percenként lefut, és ~mindent elintéz?

bármelyik esetén vannak homályos pontok bennem :(

ha le tudnád írni, hogy is kéne alkalmaznom az amit írtál, hogy jól működjön
amit szeretnék, az nagy segítség lenne.

Köszönöm

Nem intéz el mindent. A fájlnévbe valahogy varrd bele date +%s kimenetét, majd az "ls -lt | tail -1" -ből ezt vágd ki, mondjuk cut-tal. Ebből, meg az aktuális timestamp-ből ki lehet találni, hogy 300 másodpercnél régebbi-e a fál. Ha nem, akkor abba köll beletolni az adatokat, ha igen, akkor új fájlt kell írni.

A fájlok könyvtárakba szervezése, megtöltése, egyebek megoldása a te dolgod, amit én írtam, az csak egy módszer arra, hogy hogyan lehet egyszerűen matekozni időbélyeggel.

Háát, egyenlőre itt tartok, nem tudom, hogyan tovább.
gondolom hiányol egy ")" zárójelet a feltételből, az hova kellene?
meg amúgy jó lehet ez?
ez a script:

#!/bin/bash

filename="$(date +%F_%H-%M.%s)"
uccso=$(ls -rt | tail -1)
cd /home/user/data/
# 
#
#

MOST=$(date +%s)
if [ $((${MOST}-$(ls -rt| tail -1 | cut -d. -f2)) -lt 300 ]

then
  wget -O - -q http://10.0.0.1/data/data.txt >> $uccso
else
   wget -O - -q http://10.0.0.1/data/data.txt >> $filename
fi

és ez a hibaüzenet:
./get-: line 11: unexpected EOF while looking for matching `)'
./get-: line 18: syntax error: unexpected end of file

ja, még annyi, hogy arra figyeltem, hogy az utoljára írt fájl mindenképpen
az én data.txt vagyis inkább 2008-08-06_20-04.1218045896 nevű fájlom legyen

Köszi

Már kipróbáltam így:
if [ $(${MOST}-$(ls -rt| tail -1 | cut -d. -f2)) -lt 300 ]
eredmény:
line 11: 1218050087-1218050079: command not found
line 11: [: -lt: unary operator expected
és így:
if [ $((${MOST}-$(ls -rt| tail -1 | cut -d. -f2)) -lt 300) ]
ebből ez lett:

command substitution: line 11: syntax error near unexpected token `-lt'
command substitution: line 11: `(${MOST}-$(ls -rt| tail -1 | cut -d. -f2)) -lt 300'

nem tudom mi lenne a helyes feltételsor.

Köszi

Hát köszönöm szépen a segítségeket!

pme megoldása ugyan a legegyszereűbb, de hogy egy script-en belül tudjak maradni,
egyenlőre a másikat használom, de remekül működik.
Köszi még1x mindenkinek!

ui, ha nem találom meg a kövytárbapakolást (dátumos könyvtárak), kénytelen
leszek megint itt kunyizni :)

Szaszi, köszi, nemsokára kipróbálom.

Viszont az előzőekkel van egy kis gondom, úgy néz ki, hiába a 300 as szám
a végén, ami gondolom az 5 perc az 300 másodpercből jön, mégis 2 percenként hozza
létre a fájlokat:
2008-08-07_10-34.1218098041
2008-08-07_10-36.1218098161
2008-08-07_10-38.1218098281
2008-08-07_10-40.1218098401
2008-08-07_10-42.1218098521
2008-08-07_10-44.1218098641
2008-08-07_10-46.1218098761
2008-08-07_10-48.1218098881
2008-08-07_10-50.1218099002
2008-08-07_10-52.1218099121

na, ez vajon miért van???

az eddigi script:


#!/bin/bash
filename="$(date +%F_%H-%M.%s)"
uccso=$(ls -rt | tail -1)
cd /home/user/adatok/
MOST=$(date +%s)
if [ $((${MOST}-$(ls -rt| tail -1 | cut -d. -f2))) -lt 300 ]
then
  wget -O - -q http://10.0.0.1/data/data.txt >> $uccso
else
   wget -O - -q http://10.0.0.1/data/data.txt >> $filename
fi

Hát még1x nagyon kösz mindenkinek a jó ötleteket, megoldásokat.
úgy tűnik, most szaszié fut, thx

hát, már totál nem vágom,
ha futtatom kézzel, teszi a dolgát rendesen, ha a crontabba teszem, semmi,
de ha az előző IF es megoldást teszem a crontabba, az fut rendesen percenkent.

#!/bin/bash
konyvtar="$( date +'%Y/%B/%d' )"
fajl="$(date +'%H:')$(( $(date +'%M')/5*5 ))"
mkdir -p "$konyvtar"
wget -O - -q http://10.0.0.1/data/data.txt >> "$konyvtar/$fajl"

???????????????????????????????????????

HMM érdekes, fél óra múlva ismét ránéztem, látom, a var log syslog ban ott vannak
a cron logok, percenként, mondom mi a fenéért nem megy, erre meg már ott vannak
a fájlok, 5 perces nevekkel.
na mind1, most talány tényleg megy. thx

Hát asszem, visszatérő vendég leszek :(

Ha ez így működött:

#!/bin/bash
cd /home/komi/IP_Accounting/$konyvtar/
more $(ls -rt | tail -1) | awk '{sum[$2]+=$3} END {for (name in sum) print name, sum[name] }' | grep doboz | awk '{print $2}' > /home/user/data/szamol/doboz$(date +%F_)$fajl

létrehozott egy doboz+dátumidő fált, amiben a másik könyvtárban az utolsó létrehozott fájlban összeadta a harmadik oszlop értékeit, ott ahol a második oszlopban doboz szó szerepelt
tehát ha a fájlban ez volt pl.:

kocsi doboz 32
talicska doboz 8
doboz talicska 1

akkor a fájlban amit létrehozott, a 32+8 tehát 40 szerepelt, ez jól is ment ahogy néztem.

aztán jött, hogy ha eddig ok, akkor mehetnek az adatok mysql be.

#!/bin/bash
mikor="2008-08-07-16-55"
osszeg="36541"
mysql -u get -pget --host localhost -e"use get; insert into doboz values ('$mikor', '$osszeg');"

na ez egy próba volt, ez is jóóól ment, szépen betette a kívánt táblába a két változót

de amit élesbe csináltam, ott nem megy valami, a $mikor-t beteszi, de az $osszeg már üres marad
így próbáltam:

#!/bin/bash
konyvtar="$( date +'%Y/%B/%d' )"
fajl="$(date +'%Hh')$(( $(date +'%M')/5*5 ))m"
mkdir -p "$konyvtar"
wget -O - -q http://10.0.0.1/data/data.txt >> "/home/user/data/$konyvtar/$fajl"
cd /home/user/data/$konyvtar/
mikor="$( date +%F_)$fajl"
doboz=$(ls -rt | tail -1) | awk '{sum[$2]+=$3} END {for (name in sum) print name, sum[name] }' | grep 10.231.123.101 | awk '{print $2}'
mysql -u get -pget --host localhost -e"use get; insert into doboz values ('$mikor', '$osszeg');"

Miért nem megy vajon, nekem úgy tűnik, hogy ha a próbában ment, akkor itt is kéne, ami eltérés van, az az awk -s
számoló sor, először ugye ezzel csináltam:

more $(ls -rt | tail -1) | awk '{sum[$2]+=$3} END {for (name in sum) print name, sum[name] }' | grep doboz | awk '{print $2}' > /home/user/data/szamol/doboz$(date +%F_)$fajl

az adatbázisosnál így próbáltam:

doboz=$(ls -rt | tail -1) | awk '{sum[$2]+=$3} END {for (name in sum) print name, sum[name] }' | grep 10.231.123.101 | awk '{print $2}'

az már meg sem merem említeni, hogy ha az öt perces adatok bent vannak a mysql -ben, utána a letöltött txt-ket
tömörytenem kéne :S
meg, hogy mi van ezzel az oktális 9 -es problémával, meg hogy hogyan oldjam meg, hogy a mysql be
ha percenként próbál írni egy értéket, de ugyanazzal az idődátummal (ugye az 5 perces), és az időtáum a kulcs,
ezt hogy kéne megoldani.

pff. nehéz ügy ez (nekem) ha valaki tud segíteni még, mert innen nem megy megint...

Koszi a tanácsot, biztos igazad van, csak azt gondoltam megy ez bash ból is :(
Igazából ez a script csak feltölti adatokkal a mysql táblát, mást nem kell vele
tennie, csak ugye az adatokat le kell tölteni, meg megcsámcsogni kicsit.

DDDDE, közben mondom, kipróbálom, hogy beteszem a more parancsot a sorba, és így már nem üresek lesznek a mezők, van értékük.

ez van most:
[code]
doboz=$(more $(ls -rt | tail -1) | awk '{sum[$2]+=$3} END {for (name in sum) print name, sum[name] }' | grep doboz | awk '{print $2}')

még az az oktális dolog meg az, hogy ha simán futtatom 5 percen belül kétszer a scriptet, akkor duplicate entry key-t mond a mysql, ezeket kéne kiküszöbölni,
és akkor ennyi lenne a történet bash script oldali vége.

Hát tudom, hogy nem szép, nem elegáns, nem átlátható, stb.
de most kezdtem ismerkedni ezzel a dologgal, és hát ez tanulás vagy inkább
próbálgatás közben született.
Egyébként köszi, igazad van, feleslegesen iratom ki, utána meg nem kell :)

hehe, közben rájöttem, miért nem felel meg nekem (legalábbis abban a formában, ahogy gondolom), ha az awk printnél csak a szummát írja ki, mert akkor nem tudom, milyen adathoz tartozott a szumma

nyers fájl a pédában:
alma doboz 35
banán doboz 52
doboz auto 14
kukorica doboz 8
na ebből a fájból kell összeszedni, hogy mennyi volt az összeg ott ahol a doboz
a második oszlopban szerepel, és mennyi ott, ahol az elsőben (nem csak a doboz kell, a többit is futtattam új sorban)

enyemscript:


if [ $1 == 1 ]
then
  # mkdir -p ha kell
  fn=`date +%s`.txt
  mv /tmp/tempfile /ittlegyen/$fn
  # ide jon a "doboz", de nagyon nem ertem mit kell itt csinalnod
  # a letoltott file tartalma fontos lenne
  # kb. igy
  awk '/minta/ {micsinal}' $fn | mysql parameterek
  gzip /ittlegyen/$fn
else
  wget -O- -q http .... >>/tmp/tempfile
fi

Végülis úgy tűnik, kicsit átalakult a módszer, pme féle dolgot próbálom kb.
(Tudom, már nincs könyvtárakban a dátum, de úgy döntöttem minek, ha a lényegi
adatok úgyis adatbázisban lesznek, a nyers fájloknak meg mindegy, csak
ritkán kerülhetnének elő)
most ez van egyenlőre, ez ha már van 5 egyperces fájl, akkor onnan úgy tűnik
jól megy, egyenlőre csak percenként letöltöm, ötpercenként összevonom.
Úgy próbálom alakítani, hogy az ötperces fázisban már nem simán összevonom
a fájlokat, hanem megpróbálom egyből kinyerni, összegezni az adatokat és
egyből beküldeni a mysql -nek, illetve ezután a forrás 5 db egyperces fájlt
be szeretném tömöríteni.

[code]
crontab:
*/1 * * * * /home/data/perc
*/5 * * * * /home/data/otperc

perc:
#!/bin/bash
DIR="/home/data/adatok/perces"
FILE="$(date +'%F_%H-%M')"
wget -O - -q http://10.0.0.1/data/data.txt > "$DIR/$FILE"

otperc:
#!/bin/bash
sleep 30
FROMDIR="/home/data/adatok/perces"
TODIR="/home/data/adatok/otperces"
FILE="$(date +'%F_%H-%M')"
LASTFIVE=$(ls /home/accounting/adatok/perces/ -rt | tail -5)
cd $FROMDIR
cat $LASTFIVE > $TODIR/$FILE

majd "blog"-olok tovább, addig is köszi, és ha nagyon gáz amit írtam,
jószívvel fogadom a javítást, hátha majd egyszer tanulok belőle. Köszi

Sziasztok.

Kitaláltam, hogy írok egy egyzserű kis szkriptet, ami annyit csinál, hogy mikor rákattintok egy avi-ra, akkor megvizsgálja, hogy van-e az adott könyvtárban a film nevével megegyezző nevű feliratfájl (sub, srt)), és ha van, akkor az mplayer-t "-vf expand=:::::4/3"-al indítja (hogy a felirat a feketes sávba legyen), ha nincs, akkor pedig simán! Azért nem volt jó, ha mindig ott ez a vf paraméter, mert némely film mellé szürke keretet rakott (ami esetleg más méretarányú, és nem alá kelett a kiegészítés, hanem mellé).
Meg is írtam (leht, hogy kissé fapados, aki tudja, majd javít rajta, de a dolgát teszi), csak egy a gond vele, hogy ha olyan könyvtárból indítom, amelyik nevében vagy az útvolnaban bárhol szóköz van, akkor nem találja a felirat fájl-t. Hogyan lehetne megoldani, hogy müködjön így is. Illetve, ha valakinek bármilyen egyéb ötlete van, szívesen fogadom!
íme a szkript:
#!/bin/sh

FILE=$1
SRT=`echo -n "$FILE" | sed 's/\.[a-zA-Z0-9]\+$/.srt/'`
SUB=`echo -n "$FILE" | sed 's/\.[a-zA-Z0-9]\+$/.sub/'`
vansrt=`ls $SRT`
vansub=`ls $SUB`

if [ $vansrt = $SRT ]; then
echo "mplayer inditasa (srt) felirattal..."
/usr/bin/mplayer -vf expand=:::::16/10 "$FILE"
else
if [ $vansub = $SUB ]; then
echo "mplayer inditasa (sub) felirattal..."
/usr/bin/mplayer -vf expand=:::::16/10 "$FILE"
else
echo "mplayer inditasa felirat nelkul..."
/usr/bin/mplayer "$FILE"
fi
fi

Közben írtam egy másik egyszerűt, ami csak annyit tesz, hogy ha a feliratra kattintok, akkor elindítja a filmet vf -el (ez megy akármilyen könyvtárból), végülis, ez sem rossz megoldás, és egyszerű is, de jobb szeretném, ha a filmre kattintva is menne a dolog autómatikusan.
Íme ez a szkipt (mondtam, hogy egyszerű ;) ):
#!/bin/sh

FILE=$1
FILM=`echo -n "$FILE" | sed 's/\.[a-zA-Z0-9]\+$/.avi/'`

/usr/bin/mplayer -vf expand=:::::4/3 "$FILM"

<= Powered By Ubuntu & Gentoo Linux =>

'Software is like sex: It's better when it's free!'
By Linus Torvalds

Köszi mindenkinek a segítséget! De a gond, nem azzal van, hogy müködik-e a script-em, mert, lehet, hogy nem túl szép, de működik, kivéve, ha az útvonalban szóköz van (és erre keresném elsősorban a megoldást)!
Ez viszont, amit írtál, hogy mire cseréljem a ciklusom, nem működik :(.

köszönöm mindenkinek

<= Powered By Ubuntu & Gentoo Linux =>

'Software is like sex: It's better when it's free!'
By Linus Torvalds

Mivel dől az kardjába, hogy nem megy? (Egyébként nem ciklus, hanem elágazás, úgyhogy elégtelen, leülhetsz!)


if [ \( -s "${SRT}" -a -r "${SRT}" \) -o \( -s "${SUB}" -a -r "${SUB}" \)  ] 

Öregszem, az idézőjelet lehagytam. Eseleg a két változó feltöltésénél lehetne egy

s/\ /\\\ /g

de az idézőjeles megoldás szebb.

Nekem most egy olyan furmanyos script-be kene segitseg. Hogy van egy Debian-os gep amin valami spec progi es teljesen el van zarva a kulvilagtol a gep. Viszont egy olyan lehetoseget kell biztositani a szakiknak (tudjanak minden fele bealliast csinalni) hogy egy reboot utan a program inditasa elott el tudjak erni a gepet x ideig aztan folytatjuk a boot es bezarul minden eleres.
Nekem igazabol az hogy ezt hogyan lehet megoldani?
( ennel jobban nem tudom elmondni mivel igy kaptam az infot en is... :( )


if [ -d "${HOME}/vp21/bin.lnx" ]; then
echo RUN
else
cd /usr/share/vp21
./install.sh
fi
...

A fenti kódra vajon miért ad "syntax error near unexpected token `else'" hibát?

Kis awk segítséget szeretnék.
Van egy file, benne szóközökkel oszlopok:

oszlop1 oszlop2 oszlop3 oszlop4 # oszlop6 oszlop7

Ebből nekem csak 1,3,4,#,6,7 oszlopok kellenének. Eddig nem gond. Hogyan lehetne azt megcsinálni, hogy:
1. a # után minden oszlopot mutasson _vagy_
2. a 4. oszloptól minden oszlopot mutasson.

Most így néz ki:
awk '{print $1,substr($3,1,2),$4,$5,$6,$7}'
jól működik, de biztos van elegánsabb megoldás is...

Köszi,

Mik

Sziasztok!

Egyszeru problemam van csak nem lelem a megoldast, filebol szeretnek 1 sor kiiratni, az hogyan lehet?
Most igy van:

head -n5 file | tail -n1

De szerintem ennel letezik egyszerubb es szebb megoldas is.

Egy gyors kerdes, hogyan tudom lekerdezni, hogy a filrendszer (felenev) milyen karakterkodolasra van beallitva.
(utf8 | iso8859-2...)


LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=

Ebbol hogy dontom el, hogy iso8859-2 re kell konvertalnom es nem pl. 8859-1 re?
Ez esetben a helyes valasz a iso8859-2 lenne.

Ha össze van keverve, akkor biztosan nem lehet megállapítani, de a file parancs nagy valószínűséggel megmondja:
file - <<< fájlnév
Ha ISO-8859-x, akkor nem lehet megállapítani, hogy melyik, de ha magyar, akkor -2.
Nem tudom, hogy a torrent protokoll specifikálja-e a fájlnév kódolását, nem hiszem, akkor ez helyzet, tehát az, hogy csak heurisztikus módszerekkel lehet kitalálni (file parancs).
A CD/DVD fájlrendszerek megadják, hogy milyen kódolással vannak rajtuk a fájlok, a windowsos fájlrendszerek pedig UTF-16-ban tárolják a fájlokat. A rendszer ezeket konvertálva látja, az iocharset/nls/utf8 mount opcióban lehet megadni, hogy milyen kódolással, alapértelmezés iso-8859-1. Jó esetben meg kell egyeznie a redszer által használt kódolással, tehát az LC_CTYPE-pal.

Sziasztok! Szeretnék segítséget kérni az alábbi szkripthez.

#!/bin/bash
# factr.sh: Primtenyezokre bontas

echo "Adja meg a szamot"
read SZAM

echo "A $SZAM primtenyezoi:"
factor $SZAM | sed s/" "/"*"/g
exit

Ez kimenetként azt írja ki ha mondjuk a 12-t adom meg számnak, hogy
A 12 primtenyezoi:
12:*2*2*3

A feladatom az, hogy a szóközöket cseréljem ki csillagokra, de az elsőt nem akarnám kicserélni. Hogyan lehet ezt megoldani?
Köszi előre is!
Ha pedig valaki segítene ezt átültetni powershellbe, annak még külön 1000 hálám..

lehet,h butasagot fogok kerdezni, elore is elnezest erte.
tud a sed szamtani alapmuveleteket?
van 1 .csv, amely minden sor 4. oszlopa 1 napi atlaghomerseklet adatot tartalmaz fahrenheitben. ezt szeretnem atszamolni celsiusba.
valami ilyesmire gondoltam (vazlat):
sed 's/TEMP/[C]=([F]-32)*5/9/g' F >C
a regex meg hianyzik. vagy barmi, amivel raveszem,h a 4. oszlopban munkalkodjon.
ha a sed erre alkalmatlan, akkor mit ajanlotok ilyen, es ehhez hasonlo feladatok elvegzesehez. AWK, Perl, Python?
nem konkret megoldast varok, csak kis utbaigazitast. szeretnem megtanulni.
a segitseget elore is koszonom.

nagyon koszonom. majdnem tokeletes.
ha igy hasznalom, csinal 1 ujabb oszlopot es vegigirja,h -17,7778.
ha a pontosvesszot vesszore cserelem, akkor atszamolja a 4. oszlopot.
a gond csak az,h
1. az elso sor fejlec. tehat ugorja at es kezdje a 2. sorban.
2. az egesz fajlbol kiveszi a vesszoket es space delimited tesz. miert?
nagzon megkoszonnem ha roviden elmagyaraznad hogy is mukodik az altalad irt script.
amibol en tanulok awk-t (kereken 1 hete:)
Pere László - Linux felhasználói ismeretek II. kötet
The GNU Awk User's Guide
http://www.grymoire.com/Unix/Awk.html
http://www.catonmat.net/blog/awk-one-liners-explained-part-one/
egyeb otlet?
koszi!


awk -F\; 'BEGIN {OFS=";"}
          NR>1  {$4=($4-32)*5/9;
                 print; }
          NR==1 '

Bővebb magyarázat:
Az awk script minta - tevékenység "párokból áll. A speciális mintákhoz (BEGIN, END) tartozó tevékenységek az első rekord beolvasása előtt, illetve az utolsó rekord beolvasása után futnak le.
A -F kapcsolóval a mezőelválasztót állítjuk be ";"-re. A BEGIN mintánál pedig az awk egyik belső változóját, a kimeneti mezőelválasztót (OFS).
A következő minta az NR>1, azaz a beolvasott rekordok száma több, mint 1 -- a második sortól kezdve végrehajtja a megadott tevékenységet, azaz számol és kiír.
Az utolsó minta mellett nincs megadva tevékenység, ekkor az awk az alapértelmezett tevékenységet (kiírás) hajtja végre -- ahogy a minta mutatja akkor, ha a beolvasott rekordok száma pontosan egy, vagyis az első sornál.

Lehet minta nélküli tevékenységet is megadni, ez minden bementi rekordra végrehajtásra kerül azaz:


awk -F\; 'BEGIN {OFS=";"}
          NR>1  {$4=($4-32)*5/9;}
                {print;}'

Ekkor azokra a rekordokra, amikre igaz az NR>1, azokra elvégzi a számolást, utána pedig valamennyi rekordot ki is írja.

igy nez ki a bemenet 1 pici reszlete:
STN---,WBAN , YEARMODA, TEMP, , DEWP, , SLP , , STP , , VISIB, , WDSP, , MXSPD, GUST, MAX , MIN ,PRCP ,SNDP , FRSHTT,
110100,99999, 20080101, 30.7,24, 28.7,24, 9999.9, 0, 9999.9, 0, 4.7,24, 5.0,24, 8.9, 999.9, 33.8*, 23.0*, 0.00E, 0.4, 001000,
110100,99999, 20080102, 27.4,24, 24.1,24, 9999.9, 0, 9999.9, 0, 5.3,24, 6.8,24, 15.9, 999.9, 32.7 , 22.3 , 0.00E, 0.4, 001000,
110100,99999, 20080103, 28.1,24, 19.8,24, 9999.9, 0, 9999.9, 0, 5.8,24, 8.8,24, 18.1, 28.0, 36.1 , 17.6 , 0.00I,999.9, 100000,

a 4.TEMP (majd kesobb a 12.MAX,13.MIN) oszlopban levo homersekleti adatokat szeretnem atvaltani celsiusba (a peldaban: 30.7 27.4 28.1).
a homerseklettol veszovel elvalasztott szam (peldaban 24), es a tablazatban levo osszes adat ne valtozzon (se az ertek, se a space szam), csak a 4. oszlop.

igy probalkozom:
NR>1{$3=($3-32)*5/9;printf"%.1f\n",$3}
NR==1
sajnos a fejlecen es a homersekleti adatokon kivul - ertheto modon - minden elveszik.
hogy lehet megcsinalni amit szeretnek ugy,h - tetelezzuk fel - nem tudom hany oszlopot tartalmaz a fajl?
kezdem kapizsgalni a python-t es az awk-t, de meg nagyon az elejen tartok.


awk -F\, 'BEGIN {OFS=","}
           NR>1 {$4=int(0.5+($4-32)*50/9)/10;
                 $12=int(0.5+($12-32)*50/9)/10;
                 $13=int(0.5+($13-32)*50/9)/10;}
                {print}'

A bemenet:


STN---,WBAN , YEARMODA, TEMP, , DEWP, , SLP , , STP , , VISIB, , WDSP, , MXSPD, GUST, MAX , MIN ,PRCP ,SNDP , FRSHTT,
110100,99999, 20080101, 30.7,24, 28.7,24, 9999.9, 0, 9999.9, 0, 4.7,24, 5.0,24, 8.9, 999.9, 33.8*, 23.0*, 0.00E, 0.4, 001000,
110100,99999, 20080102, 27.4,24, 24.1,24, 9999.9, 0, 9999.9, 0, 5.3,24, 6.8,24, 15.9, 999.9, 32.7 , 22.3 , 0.00E, 0.4, 001000,
110100,99999, 20080103, 28.1,24, 19.8,24, 9999.9, 0, 9999.9, 0, 5.8,24, 8.8,24, 18.1, 28.0, 36.1 , 17.6 , 0.00I,999.9, 100000,

Az eredmény:


STN---,WBAN , YEARMODA, TEMP, , DEWP, , SLP , , STP , , VISIB, , WDSP, , MXSPD, GUST, MAX , MIN ,PRCP ,SNDP , FRSHTT,
110100,99999, 20080101,-0.6,24, 28.7,24, 9999.9, 0, 9999.9, 0,-15.1,-4.3, 5.0,24, 8.9, 999.9, 33.8*, 23.0*, 0.00E, 0.4, 001000,
110100,99999, 20080102,-2.5,24, 24.1,24, 9999.9, 0, 9999.9, 0,-14.7,-4.3, 6.8,24, 15.9, 999.9, 32.7 , 22.3 , 0.00E, 0.4, 001000,
110100,99999, 20080103,-2.1,24, 19.8,24, 9999.9, 0, 9999.9, 0,-14.5,-4.3, 8.8,24, 18.1, 28.0, 36.1 , 17.6 , 0.00I,999.9, 100000,

nagyon koszonom,h segitesz!
a bemenet egesz pontosan igy nez ki:
http://www1.ncdc.noaa.gov/pub/orders/CDO1668911735725.txt
van benne space, tab (v. tobb space), vesszo.
gondolom ezert van,h nalam a kimenet elcsuszik.
az altalad irt szkriptet ertem, csak hiaba modositgatom, nem tudom ugy megcsinalni,h ne csusszon el.

"van benne space, tab (v. tobb space), vesszo."
Csak a pontosítás miatt: az első hozzászólásban CSV-ként határoztad meg a formátumot, így a mezőhatároló a vessző, a többi pedig a mező tartalma.

Tehát, kérésednek megfelelően, az elsőre számnak látszó mezők (a mezőhatároló vesszők által közrefogott terület) valójában továbbra is szövegként kezelendők, de a benne lévő egy darab számot át kell alakítani.

"gondolom ezert van,h nalam a kimenet elcsuszik."
Hogyan és mi csúszik el mihez viszonyítva? A linkelt táblázat egy CSV, de nem elhanyagolható, hogy az adatai fix mezőszélességre vannak kitöltve. Most azt kérted, hogy a mezőben lévő kitöltő karakterekhez (whitespace) ne nyúljunk. Így ennek az lesz a folyománya, hogy mivel a táblázatban szereplő hőmérsékletértékek Celsiusban kifejezve negatív értékek is lehetnek, valamint egy- és kétjegyű is lehet az egészérték, ezért ezekben az esetekben változhat a szám hossza, valamint nem feltétlen egyezik meg a Fahrenheitben kifejezett hosszal.

Lehet hogy van jobb és szebb megoldás, de ha a számolás után visszahelyettesítjük az új értéket a régi helyére, akkor megfelelő lesz a kimenet. Módosítva zeller példáját:


awk -F\, 'BEGIN {OFS=","}
          NR>1 {uj4=int(0.5+($4-32)*50/9)/10;
                uj12=int(0.5+($12-32)*50/9)/10;
                uj13=int(0.5+($13-32)*50/9)/10;
                sub(/[0-9.-]+/, uj4, $4);
                sub(/[0-9.-]+/, uj12, $12);
                sub(/[0-9.-]+/, uj13, $13);}
               {print}'

szuper. koszonom! majdnem azt csinalja, amit latni szeretnek.
csak meg mindig elcsuszik az eredetihez kepest. lehet,h ez nem is olyan fontos, de szeretnem megtanulni.
ha a fahrenheit 30.7 akkor a celsius -0.6 lesz. mindharom ertek 4 karakter, tehat a sor nem csuszik.
ha F=24.7, akkor C=-4, igy az egesz sor csuszik 2 karaktert balra.
ezt szeretnem kikuszobolni. mezon belul lehet jobbra igazitani? vagy hogy tudom megtartani a fix mezoszelesseget?

azert fogalmazok pontatlanul, mert (egyenlore) nem ertek hozza. de szeretnek. mert kell es mert erdekel. megegyszer koszonom,h segitetek.

EgyeLőre, n nélkül. A bemeneti és a kimeneti sorok hosszát egyeNlőre szeretnéd beállítani, ami egyelőre nem megy.
Ha fix mezőszélességet akarsz, akkor a printf és %Ns meg %Nd illetve %N,Mf a barátaid.

A %s balra, a %d és %f jobbra igazít, ennek megfordításához a mező szélességét negatív előjellel kell ellátni. A mező szélessége legalább a % után megadott érték lesz, tehát ha egy %2s mezőbe berakod, hogy "blabla", akkor a mező nem kettő, hanem hat karakter széles lesz.


$ echo egy |awk '     {printf "|%5s|%-5s|%1s|\n", $1, $1, $1;}
                  END {print  "|12345|12345|12345|";}'
|  egy|egy  |egy|
|12345|12345|12345|

koszonom zeller, sikerult!

BEGIN {OFS=","}
NR>1 {$4=int(0.5+($4-32)*50/9)/10;
$18=int(0.5+($18-32)*50/9)/10;
$19=int(0.5+($19-32)*50/9)/10;}
{printf "%6s,%5s,%9s,%7s,%2s,%6s,%2s,%6s,%2s,%7s,%2s,%6s,%2s,%6s,%2s,%6s,%5s,%8s,%7s,%5s,%5s,%7s,\n" \
,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22;}

eleg "barkacs" megoldasnak tunik, de mukodik.
hogyan tudom ugyanezt 1 olyan bemenettel elvegezni, ahol nem ismerem a mezok szamat?
tehat minden mezohatarolo maradjon a helyen.

Ha az IFS nem whitespace (space, tab), hanem mondjuk ",", akkor a szóköz is a mező része, ergo a sima print $0 is korrket kiementet fog adni -- hacsak valamelyik mező tartalma nem változott meg.

A sprintf() és a length() használatával azért lehet érdekes dolgokat művelni:


$ awk -F, '{uj=int(0.5+($2-32)*50/9)/10; printf(sprintf("%%s,%%%d.2f,\n",length($2)), $1, uj); }' 

Bemenet:


   a   ,   123,
aaaaaaa,   23 ,

Kimenet:


   a   , 50.60,
aaaaaaa, -4.90,

Ismeretlen számú mező esetén ciklus 1-től NF-ig, a cikluson belül meg elágazni: ahol számolni kell, ott a fenti sprintf... length móka, ahol meg nem, ott egy sima printf "%s" $i.

Még egy dolog. Ha a teljes kimeneti rekordot te rakod printf() használatával össze, akkor fölösleges az OFS megadása.

Esetleg lehet az OFMT-vel is játszadozni...

Sziasztok!

A következő problémára keresek megoldást, lehetőleg awk-ban, vagy perl-ben.
Van egy logfile, ahol egy log bejegyzés több sorból áll, és az egyes bejegyzéseket egy üres sor választja el egymástól.
Azaz:

log entry 1 kezdodik (timestamp)
log entry 1 ...
log entry 1 ...
log entry 1 vege

log entry 2 kezdodik
log entry 2 ...
log entry 2 vege

A feladat, hogy az egyes log entryket egy sorossá konvertáljam, azaz pl:
log entry 1 kezdodik (timestamp) log entry 1 ... log entry 1 ... log entry 1 vege
log entry 2 kezdodik log entry 2 ... log entry 2 vege

Jelenleg a lenti, eleg ronda megoldasom van awk-ban, valami elegansabbat szeretnek, ami nem csak 10 soros log entrykig működik :)
Előre is köszönöm a segítséget!

BEGIN { RS="" } { print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10; }

Üdv

lenne egy olyan esztétikai problémám, hogy albiban lakom, és kb 5en használunk 1,5 Mbit internetet.
egy olyan megoldásra lennék kíváncsi:

egy script figyeli a routert, vagy belső hálózatot, hogy éppen hányan lógnak rajta, és ez alapján határozná meg a letöltési sebességem. gondolok itt arra, hogy ha senki nem használja a netet, 100kb/s töltsön, ha 2,3,4,5 ember, akkor 80, 50, 25, 12 kb/s-re korlátozza a netem.
nagyrészt torrentezek, eddig manuálisan állítottam, ha nagyon hupákoltak, lecsökentettem 50-re.

megközzelítés: végigpingelek 10-15 IP-t, megnézem a válaszolt IP-k számát, és eszerint korlátozom, elég ha a transmission klienst, de ha ez nem megoldható, akkor az egész ubuntut 8.04

tud ebben segíteni nekem valaki?

1. Fix IP címeket oszt a router? (Azaz lehet tudni, hogy mik a lehetséges kliensek? Én így csinálnám.)
2. A routeren Linux fut, ill. lehet scripteket futtatni?
3. Ha jól tudom, vannak olyan megoldások, amik a router-en alacsonyabb prioritásúra állítják a torrentet, ebben talán mások segítenek.

háj

aliases fájlal kapcsolatban kérnék segítséget.

spam: "| /usr/bin/dspamc --client --user $u --class=spam --source=error"

ez egyenlőre = spam@domain.com-al. működik

ez eddig jó, úgy kéne megoldani, hogy
spam-$VIRTUAL_USER$: "| /usr/bin/dspamc --client --user $u --class=spam --source=error"

az userek MYSQL táblában vannak.

1) egyenlore a darabolos gyilkos fog vagni, de egyelore talan megkimel.
2) A MySQL transport tablaba kell asszem ezt betenni, bar a virtual aliases tablaba ugyanez a szuros kifejezes is muxhet. mindenkihez kulon aliast kell felvenni, ezt a kesobbiekben egy trigger alkalmazasaval kerulheted meg.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Sziasztok.

Van egy olyan problémám, hogy a gnome-screensaver, de az xscreensaver sem kapcsolja ki a laptop kijelzőjét. Kutakodtam, és megtaláltam, hogy ezt az xset-el csinálja ill csinálná, kipróbáltam, tényleg nem csinálja, viszont a vbetool kikapcsolja. Kutattam a neten, de nem találtam megoldást arra, hogyan mondhatnám meg a képenyővédőnek, hogy a vbetool-t használja az xset helyett, így arra gondoltam, írnék egy kis script-et, amit xset néven elmentek, így azt hívná meg a képernyővédő, de a script a vbetool-t futtatná. A lényeg a xset így müködik: 'xset dpms force off' a vbetool pedig 'vbetool dpms off' ill 'xset dpms force on', 'vbetool dpms force on', szóval nem egyezik a paraméterezés, ezért olyan scriptet kéne írni, amit ha dpms force off -paraméterrel indítok, akkor a 'vbetool dpms off' parancsot hajtja végre, ha dpms force on -paraméterrel indítom, akkor pedig a 'vbetool dpms on' -t hajtja végre.
Ha bárkinek van jobb ötlete, azt is szívesen fogadom!

köszönöm

<= Powered By Ubuntu & Gentoo Linux =>

'Software is like sex: It's better when it's free!'
By Linus Torvalds

xset:
#!/bin/sh
[ "X$0" = Xxset -a "X$1" = Xdpms -a "X$2" = Xforce ] && vbetool $1 $3 || xset.orig "$@"

Feltetelezve, hogy az eredeti xset -et xset.orig neven mentetted el valahova. (Esetleg mindent lehet torolni a "[" utantol az elso "-a"-ig bezarolag, ha esetleg az xset-et elkepzelheto, hogy PATH-szal egyutt hivja barki is.)

Najo, jofej leszek, bar kb 5 perc googlezas utan vagy egy man bash kiadasaval akarki meg tudna oldani a dolgot.

Az alabbi megoldas valoszinuleg nem a legszebb, legjobb, stb, ellenben ez jutott eszembe, es elvileg mukodik. Jo szokasom szerint nem probaltam ki, ha bugos, majd kijavitja aki akarja.

Tehat:


#! /bin/sh

case "$@" in
*dpms*)
vbetool dpms $3
;;
*)
echo "Unhandled parameters: $@" >&2
exit 1
;;
esac

Edit: wow, eletemben eloszor veszem eszre a lap aljan a kovetkezo oldalra atvivo linket. Mindig tanul valamit az ember!

Sziasztok!

A problema:

Amikor a sikeresen megnyitott fajlokat keressuk (vagy a sikeresen elinditott programokat) vigyazzunk arra, hogy pl az open(2) vagy execve(2) hivasoknal – a systém cals ok gy fognak kinezni, ezt megnezhetjuk az sh.strace fajlon: Szvl meg azt is figyelemmel kell kiserni h a processz meg fut e.
PID open("soubor", ...,
es amikor visszaadtuk a jogokat az eredeti processznek ezt figyeljuk
PID <... open resumed> ) = folyamat eredmenye
, ez tipikus peldaja annak, hogy a kernel nem var a hardware-re es azkozben kulonbozo processzeket is futtat.

pl itt: http://www.fit.vutbr.cz/study/courses/IOS/public/Lab/projekt1/sh.strace

ezen a fajlon nezhetjuk meg..

Elore is koszonom a segitseget!!

AZ ELSO PROBLEMA MEGOLDODOTT:

szerintetek ezt hogy lehetne megoldani?

$SCALLS van egy txt fajlban es lekellene cserelni egy tobbsoros szoveggel?

$SCALLS van egy txt fajlban es lekellene cserelni egy tobbsoros szoveggel?

ed!


(cat <<EOF
/\$SCALLS
d
a
$TOBBSOROSSZOVEG
.
w
q
EOF
) | ed -p $file

ezt szepen ciklusban amig grep -q '$SCALLS' $file azt jelzi hogy van meg mit tenni.

Csunya, ronda, de epp ez a jo benne.

Sziasztok!

van egy log fileom, amiben nehany logbejegyzes a kovetkezo formaju:

2009-01-11 whatever [97,98,99,100,101]

ez egy lista, ami betuk ascii kodjat tartalmazza.
az ilyen entryket szeretnem atforgatni ilyen formajura:

2009-01-11 whatever [abcde]

Tehat az a lenyeg, hogy a lista helyett a sztringet szeretnem latni.

Van egy nagyon csunya megoldasom awk-ban, ami rekordonkent megnezi, hogy lista formaju-e, utana split-tel a ',' karakternel, majd sprintf-el kiir. Ha esetleg valakinek van elegansabb otlete, azt megkoszonnem! :)

Sziasztok

Van egy parancsom, ami többsoros kiemnetet ad, konkrétan df.
Ha kíváncsi vagyok egy partíción lévő szabad helyre, akkor grep partíciónév | awk'{print $4}' -gyel pipe-olva megkapom.
Namost ezt szeretném megcsinálni több partícióra, vagyis a kimenetnek minden sorára egyszerre úgy, hogy csak egyszer kelljen meghívni a df-et.
Meg lehet ezt úszni ideiglenes fájl létrehozása nélkül?
Vagy valami más ötlet esetleg?

Kösz, üdv

Üdv!

Állítólag ez lassabb:


yes | head -n100000000 | grep y >/dev/null && echo Ipszilon lassan

mint ez:


yes | head -n100000000 | grep -q y && echo Ipszilon gyorsan

Tipp: a man nem ír semmit arról, hogy a grep "-q" paraméterrel használva a legelső találat esetén kilép-e vagy sem, szerintem igen (ami olykor kapóra jöhet)

Véleményt, tapasztalatokat várok.

ami át van húzva, azt teljesen fölösleges elolvasni. az olyan, mintha ott sem lenne

Hogy is fogalmazzak... Szóval az első megjegyzésben nem tudok igazat adni neked, a -q POSIX opció, és by design első találat után exit(0)-lal kilép: http://www.opengroup.org/onlinepubs/009695399/utilities/grep.html

Az persze lehet, hogy egy-két grep-variáns nem POSIX-konform, de nekem a GNU grep 2.5.3 ebből a szempontból korrekten működik.

Nálam...:


$ man grep
...
    -q, --quiet, --silent
           Quiet;   do   not  write  anything  to  standard  output.   Exit
           immediately with zero status if any match is found, even  if  an
           error  was  detected.   Also see the -s or --no-messages option.
              (-q is specified by POSIX.)

    -s, --no-messages
           Suppress error messages about nonexistent or  unreadable  files.
           Portability note: unlike GNU grep, 7th Edition Unix grep did not
           conform to POSIX, because it lacked -q and its -s option behaved
           like  GNU  grep's  -q option.  USG-style grep also lacked -q but
           its -s option behaved like GNU  grep.   Portable  shell  scripts
           should  avoid  both  -q  and -s and should redirect standard and
           error output to /dev/null instead.  (-s is specified by  POSIX.)
...
$ grep -V
GNU grep 2.5.3

Copyright (C) 1988, 1992-2002, 2004, 2005  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Ez nem jelenti azt, hogy mindenütt, de vélelmezem, hogy a gnu grep így működik -- az más kérdés, hogy a manpage szerint sem igazán portábilis a dolog -- sajnos.

A következőt szeretném megoldani: Adott egy könyvtár több alkönyvtárral és sok fájlal. Na most nekem kellene egy másolat elről de csak a könyvtárakkal, vagyis a fájlok nem kellenek. A legjobb az lenne hogyha azt is meg lehetne adni, hogy csak bizonyos mélységig lépjen be a könyvtárszerkezetbe a script.
find type és maxdept-el kitudom listázni az érintett könyvtárakat de hogy másolom őket, hogy ne húzzák magukkal a bennük lévő fájlokat is?

Szevasztok,

az a gondom, hogy 001.jpg - 999.jpg -ig kellene file-okat elneveznem, de ha a let "n = n + 1" -et használom a ciklusban, akkor a 00-kat lecsapja a számból (miért ne csapná). Hogy tudom rákényszeríteni, hogy 001, 002, 003 stb neveket kapjak?

Köszi,
G

Sziasztok!

Van egy egyszerű kis scriptem ami egy betű tartományon végiggyalogolva csinál valamit:

#!/bin/bash
echo -n "Source disk? (example: sda) "
read src
echo -n "Destination disks? (example: a..b) "
read des
for i in {b..f}
do
   sfdisk -d /dev/$src |sfdisk -f /dev/sd$i
done

A probléma az, hogy a {b..f} helyére szeretném a $des -t betenni, de némi fórumozás és teszt után úgy látom ez nem ilyen egyszerű. Szóval hogyan lehetne megoldani, hogy a for ciklus egy változóban meghatározott betű tartományon dolgozzon?

Köszi, Mik