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
Вот небольшой фрагмент, который может помочь вам в том, что вы пытаетесь сделать, надеюсь, с логикой все в порядке:
#!/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
Если у вас есть 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, чтобы увеличить или уменьшить число параллельных соединений.