for n in {1000..1200}; do ....
Tuossa kokeillaan onko 1000, 1001, 1002,.... Löytyyhän se noinkin mutta tehdään aina 200 yritystä eli tämä on "raa'an voiman ratkaisu".
Usein tehokkain ratkaisu on keksiä seula joka mahdollisimman nopeasti poistaa ei-toivotun datan ilman että tarvitsee pyöriä silmukassa. Putkessa edettäessä työ nopeutuu putken loppua kohti datan vähetessä. Esitän tämän esimerkin teknisestä uteliaisuudesta ajatuksella oppia itse ja näyttää mullekin vaikka tuo ratkaisusi on riittävän tehokas mille hyvänsä koneelle ja tekee työnsä.
time for n in {1000..1200}; do apu=$(cat /etc/passwd | grep ':'$n':' ); [[ ! $apu ]] && continue || echo ${apu%%\:*}; done
.
.
real 0m3.808s
user 0m1.132s
sys 0m0.680s
time cat /etc/passwd | grep "/home/" | awk -F':' '{ if ( $3 >= 500 ) print $1 }'
.
.
real 0m0.042s
user 0m0.012s
sys 0m0.004s
Jälkimmäinen tapa on noin 91 kertaa tehokkaampi. Selitän hieman mitä tuo tekee. Ensin listataan tuo "passwd" -tiedosto, poimitaan mukaan vain ne rivit joilla esiintyy "home". Tuossa vaiheessa datan määrä jo pieneni paljon. Poimitaan niistä mukaan vain ne joissa kolmannessa kentässä lukee yli 500 ja tulostetaan (eli välitetään eteenpäin) näistä pelkästään kenttä numero yksi eli käyttäjätunnus. "awk" on tuossa kätevä kun sille voi kertoa että kaksoispiste on välimerkki joka erottaa kentät. Tuohon voi tietysti valita minkä merkin kulloinkin tarvitsee kentän välimerkiksi, tässä tapauksessa tarvittiin kaksoispistettä.