#!/bin/bash
first=$( head -n1 file | awk -F" +" '{print $2}' )
last=$( tail -n1 file | awk -F" +" '{print $2}' )
for (( i=$first ; i<=$last ; i=i+10000 )) ; do
awk -v start=$i -v end=$(($i+10000)) 'BEGIN { FS == " +" } { if ( $2 >= start && $2 < end ) print $0 }' file \
>> interval_"$i"_to_"$(( $i+10000 ))"
done
Тест с интервалом 100:
more inter*
::::::::::::::
interval_61336212_to_61346212
::::::::::::::
chr19 61336212 + 0 0 CG CGT
chr19 61336213 - 0 0 CG CGG
chr19 61336218 + 0 0 CG CGG
chr19 61336219 - 0 0 CG CGC
chr19 61336268 + 0 0 CG CGG
chr19 61336269 - 0 0 CG CGA
::::::::::::::
interval_61336312_to_61346312
::::::::::::::
chr19 61336402 + 0 0 CG CGG
chr19 61336403 - 0 0 CG CGT
Примечание: вместо пустых интервалов будут создаваться пустые файлы; для удаления пустых файлов добавьте:
for file in interval* ; do
if [ ! -s "$file" ] ; then
rm "$file"
fi
done
Будет запускать файл для каждого шага в цикле for
, поэтому не самый эффективный.
Соответствующая часть /proc/mdstat
выглядит так, как показано ниже, где U
означает устройство, находящееся в состоянии «включено», а _
устройство, находящееся в состоянии «внизу». Когда он восстанавливается, устройства отображаются как «неработающие», поэтому мы можем подождать, пока все устройства снова не «включятся».
md0 : active raid5 sda1[0] sdd1[2] sdb1[1]
1465151808 blocks level 5, 64k chunk, algorithm 2 [4/3] [UUU_]
Вот примерно так:
dev=md0
until grep -A1 "^$dev :" /proc/mdstat | grep -q '\[UU*\]' ; do
sleep 2
done
run some command here...
(Первый grep
ищет заданное имя устройства, а grep -A1
печатает соответствующую строку плюс еще одну после. Второй ищет строку U
между скобками.)
Конечно, это никогда не проверяет, выполнялось ли восстановление в первую очередь, нам потребуется более разумная логика для интерпретации полного вывода, поскольку количество строк вывода варьируется.
Я делаю это в Ubuntu 18.04LTS, поэтому, возможно, grep
отличается, но A1
дает вам одну строку, поэтому ваша проверка не работает. Я изменил его на grep -A2
и теперь могу, по крайней мере, вернуть то, о чем вы говорите, с помощью:
dev=md0
foo=$(grep -A2 "^$dev :" /proc/mdstat);echo $foo
Пример вывода:
md0 : active raid5 sdh1[0] sdg1[1] sdf1[2] sde1[4] 8790399744 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU] bitmap: 0/22 pages [0KB], 65536KB chunk
Итак, я думаю, следует читать:
dev=md0
until grep -A2 "^$dev :" /proc/mdstat | grep -q '\[UU*\]' ; do
sleep 2
done
Whatever you want to do goes here.
Ура!