Portál AbcLinuxu, 12. května 2025 06:35
NODES=$(awk '/mycloud/ { print $1 }' /etc/hosts) CTID=$(for NODE_IP in ${NODES}; do ssh root@${NODE_IP} 'vzlist -a' | awk '/[:alnum:]/ { print $1 }' done | sort -g | tail -1) echo ${CTID}Tento vystup mi vrati 126
SEQ=$(seq 101 129)
Potom stačí porovnat rozdíly.
diff <(echo "$CTID") <(echo "$SEQ") | grep \> | head -n1 | sed 's/> //'
Jen si nejsem jistý, jestli to tak bude opravdu efektivnější, než tu sekvenci prostě projít cyklem a kontrolovat, jestli je prvek aspoň o dva větší než předchozí (a vypsat poslední plus jedna, když se tam takový nenajde).
Trochu mi to připomíná fóra PHP skriptařů, kde je snaha vyřešit všechno výhradně skládáním hotových funkcí, přestože je výsledek nezřídka zoufale neefektivní a daleko krkolomnější než přímočaré řešení pomocí základních prvků jazyka.
Z hlavy a bez kontroly by to mohlo vypadat nějak takhle:
function hole () { local prev curr for curr in "$@"; do if [ -z "$prev" ]; then prev="$curr" continue fi if [ $[curr - prev] -gt 1 ]; then echo $[prev + 1] return fi prev="$curr" done echo $[curr + 1] }
Velmi snadno si s tím poradí awk
. Příklad:
echo 101 102 103 107 108 111 112 121 122 123 124 125 126 |\ awk '{ last = $1; for (i = 2; i <= NF; ++i) { if ($i - last > 1) break; last = $i } print last + 1 }'
Dokonce to zpracuje i víc takových řádků po sobě, když na to přijde.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.