( Zahy | 2024. 05. 29., sze – 14:00 )

Szerkesztve: 2024. 05. 29., sze – 14:08

Hát akkor lépésről lépésre. A jelenlegi listából összegyűjteni azt a pár százat, az 21 karakter awk-ban (igazából 19, mert nem kell a feltétel köré a zárójel):

awk '( $1 > m[$NF] ) {m[$NF]=$1 } '

Itt kihasználod hogy asszociatívak a tömbök, tehát a mindenkori utolsó mező ( awk-nyelven $NF ) pont jó lesz indexnek, és eltárolod értékként az időbélyeget; valamint kihasználod, hogy nem létező változó értéke az üres sztring, ami aritmetikai műveletben nulla értékű. Így ha még nem volt a gép, akkor 0 lesz a (nem-létező) tömbelem értéke, aminél kb bármilyen timestamp nagyobb. Ha meg már volt ilyen gép, akkor amelyik ts az újabb, az tárolódik.

Hátramarad a DB-nek szóló parancs, ez sokkal hosszabb, és sokat kell szarozni az aposztrófokkal és idézőjelekkel. Itt és most az egyszerűség kedvéért csak kiírom az általad adott UPDATE parancsot gépenként, erre meg pont jó az END mintában egy for ciklus. Azaz fentihez még hozzá kell rakni:

'END { for ( i in m ) { print "UPDATE servers set backup=" m[i] " WHERE hostname=" i " ; " }'

És ezt megeteted azzal az SQL-t tudó akármivel, azaz:

awk '$1 > m[ $NF ] { m[ $NF ] = $1 }

END { for ( i in m ) { print "UPDATE servers set backup=" m[ i ] " WHERE hostname=" i " ; " }' < szövegfájl_nevekkel_és_ts_sel | SQL_parancs