Bash :параллельный завиток и переменные

grep -xE '[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?'

С помощью -xмы привязываем регулярное выражение к началу и и строки, поэтому строки должны соответствовать этому шаблону в целом, а не шаблону, найденному где-либо в строке.

Если вы хотите сопоставить все те, которые поддерживаются POSIX/C strtod(), как признано многими реализациями утилиты printf, например:

r=[$(locale decimal_point)]
d=[0-9]
h=[0-9abcdefABCDEF]
grep -xE "[[:space:]]*[-+]?($d*$r?$d+([eE][-+]?$d+)?|\
0[xX]$h*$r?$h*([pP][-+]?$d+)?|\
[iI][nN][fF]([iI][nN][iI][tT][yY])?|\
[nN][aA][nN]|\
NAN\([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9_]+\))"

Таким образом, включая такие вещи, как 0x3f, 0xFP -4, -Infinity, NAN (что угодно ).

$ printf '%g\n' 0x3f 0xFp-4 -Infinity 'NAN(whatever)'
63
0.9375
-inf
nan
0
15.12.2020, 22:38
2 ответа

Вот небольшой фрагмент, который может помочь вам в том, что вы пытаетесь сделать, надеюсь, с логикой все в порядке:

#!/bin/bash
i=0
j=0
pid=0
ppid=0
#Enable job control; It's not used here but it can be usefull if you need to do more job control
set -m 
for i in {1..3000} ; do
    #Execute each curl in the background to have a sort of multi-threading and get get the HEAD response status and put it in file descriptor 3 to be gathered later
    exec 3< <(curl -I ${URL}file${i}-{j}.jpg | head -n 1 | cut -d$' ' -f2)
    #Get the pid of the background job
    pid="$!"
    #Get the parent pid of the background job
    ppid="$(ps -o ppid= -p $pid)"
    #Gather the HTTP Response code
    status="$(cat <&3)"
    #Check
    if [ "$status" -eq 200 ] ; then
        i="$(($i - 1))"
        j="$(($j + 1))" 
        echo "kill all previous background process by their parent"
        pkill -P $ppid
    else 
      i="$(($i + 1))"
    fi 
    echo " status : $status"
    echo " parent : $ppid"
    echo " child : $pid"
done
1
18.03.2021, 22:42

Если у вас есть GNU Parallel, что-то вроде этого должно работать (i=1..3000; j=1..1000):

do_j() {
  j=$1
  URL='https://www.example.com/data/file'
  seq 3000 |
    parallel --halt soon,success=1 -j100 "curl -I ${URL}file{}-${j}.jpg | grep 'HTTP.* 200 OK'"
}
export -f do_j
seq 1000 | parallel -j1 do_j

Отрегулируйте -j1 и -j100, чтобы увеличить или уменьшить число параллельных соединений.

1
18.03.2021, 22:42

Теги

Похожие вопросы