Ez a következő awk
szkript, amely a következő bemeneti fájlt veszi fel, input.txt
és az alábbi kimenetet állítja elő. Tudna valaki szánni időt arra, hogy lebontsa a awk
szkript működését? Töltöttem rá egy kis időt, és ennek nincs sok értelme.
Input:
$ cat input.txt
FINISHED RSYNCJOBNA 20140502 0021 2182096 2082096 6 5 2014820905820902 10:02:15 2014820905820902 10:56:42 0:54:27 INITIATED RSYNCJOBNA 20140502 0022 3282096 3182096 6 5 2014820905820902 15:31:06 0:06:04 ce eque**
Kimenet:
RSYNCJOBNA|0021|20140502|10:02:15|10:56:42|0:54:27|FINISHED RSYNCJOBNA|0022|20140502|15:31:06| |0:06:04|INITIATED
Parancs a fenti ouput megszerzéséhez:
awk -v OFS="|" "/FINISHED|INITIATED/ { status = $1; getline; jobname = $1; getline; sequence = $2; date = $1; getline; start = $2; getline; if (status == "FINISHED") { end = $2; getline } else { end = " " } runtime = $1; print jobname, sequence, date, start, end, runtime, status; }" input.txt
Megértésem szerint /FINISHED|INITIATED/ {}
azt jelenti, hogy a göndör zárójelek belsejében lévő parancsok csak FINISHED
vagy INITIATED
, de amennyire a kimenetből meg tudom állapítani, úgy tűnik, hogy a szkript minden sorból elemzi. Mi folyik itt?
Megjegyzések
Válasz
A getline
függvény beolvassa a következő sort, és áthelyezi a szkriptet. az egymást követő getline
hívások a következő sorra lépnek. Ezt talán könnyebb megérteni egy példával:
$ cat input.txt foo 1 2 $ awk "/foo/{print; getline; print; getline; print}" input.txt foo 1 2
As amint fent látható, a szkript feldolgozza az első sort, mert megfelel az foo
szónak. A getline
minden hívása beolvassa a sort az aktuális után, így a következő print
hívások kinyomtatják a következő sorokat.
Válasz
Ha nem tudja, mit csinál egy awk
függvény, akkor a szokásos stratégia megnézni a man oldalt:
getline
A következő beviteli rekordból állítson be 0 dollárt; állítsa be NF, NR, FNR, RT
A parancsblokk valóban csak kétszer kerül végrehajtásra. A többi sort a getline
segítségével kezeljük a blokk.
Ezt át lehet írni a következőre:
/FINISHED|INITIATED/ { status = $1; line_number=0; next; } { line_number++; } line_number==1 { jobname = $1; } line_number==2 { sequence = $2; date = $1; } ...
Megjegyzések
- Mi történik, ha a következő rekord üres?
- @AvinashRaj Sem a kódod, sem az alternatívám nem nézi a sorok tartalmát (a
/FINISHED|INITIATED/
kivételével ). A sorokat csak visszaszámolják. Az adatokat pontosan el kell rendezni (egy awk parsi-ból) ng perspektíva) az Ön által bemutatott módon, különben a kód megszakad.
/FINISHED|INITIATED/
, akkor az awk megkeresi a megfelelő sort, és a műveletet csak az adott soron végzi. De a műveletet minden vonalon elvégezték. Hogyan?