mdadm --add
откажется работать на уже смонтированном блочном устройстве. (Я не проверял, что это полностью предотвращает потерю данных :).
Однако он не проверяет наличие существующей файловой системы, отличной от -RAID. Он также не сравнивает идентификаторы RAID UUID в разделах RAID.
Не забывайте соблюдать осторожность при использованииmdadm --add
:). Точно так же, как и с... почти любой другой командой, которую вы запускаете с привилегиями root
.
Я написал для вас простой скрипт на Python, который сделает это:
address1 = input("Enter first file address:\n")
address2 = input("Enter second file address:\n")
data1 = []
data2 = []
with open(address1) as file:
data1 = file.read().split('\n')
with open(address2) as file:
data2 = file.read().split('\n')
if data1[-1] == "": data1.pop()
if data2[-1] == "": data2.pop()
for i in data1:
for j in data2:
if i.split(' ')[1].strip() == j.split(' ')[1].strip():
print(i + ' ' + j)
Предполагая, что c1.log, c2.log и следующий скрипт находятся в одном каталоге, это должно работать.
while read i
do
c1_array=( $i )
string1=${c1_array[1]}
while read j
do
c2_array=( $j )
string2=${c2_array[1]}
if [ $string1 = $string2 ]
then
echo "$i $j"
fi
done < c2.log
done < c1.log
Или, если ваши файлы отсортированы по-k2
join -j2 -o 1.1 1.2 2.1 2.2 c1.log c2.log
Выход:
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff
join
может сделать большую часть работы за вас. Он объединяет совпадающие строки из двух файлов, совпадающие во втором поле, как здесь:
$ join -j 2 c1.log c2.log
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E1W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E2W
/u02/app/oracle/db/ggs/current/dirdat/fe D1W E3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F1W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F2W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F3W
/u02/app/oracle/db/ggs/current/dirdat/ff D2W F4W
Что дает вам совпадение и первый столбец c1 и c2 в одной строке. Join требует, чтобы входные файлы были отсортированы. Если их нет, вы можете отсортировать их на лету:join -j2 <(sort c1.log) <(sort c2.log)
. Это магия оболочки -. <( some command )
будет выглядеть как файл для join
или любой другой команды, которой нужен файл.
Обработаем их дальше:
$ join -j 2 c1.log c2.log | while read match c1 c2; do printf '%s %s\t%s %s\n' $c1 $match $c2 $match; done
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff
Готово!
Здесь команды красиво упакованы, поэтому при необходимости вы можете вставить их в скрипт:
join -j 2 c1.log c2.log \
| while read match c1 c2; do
printf '%s %s\t%s %s\n' "$c1" "$match" "$c2" "$match"
done
Если вам не нужна табуляция между двумя частями @bu5hman найдет лучший ответ .
Обновление:
Вы также можете получить соединение для вставки вкладок :join -t' ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log)
Пробел после -t'
— буквальная табуляция. Нажмите Ctrl+V, затем TAB для этого. Плюс я делаю встроенную сортировку файлов.
$ join -t' ' -j2 -o 1.1 1.2 2.1 2.2 <(sort c1.log) <(sort c2.log)
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D1W /u02/app/oracle/db/ggs/current/dirdat/fe F4W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff E1W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff E2W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff E3W /u02/app/oracle/db/ggs/current/dirdat/fe
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F1W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F2W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F3W /u02/app/oracle/db/ggs/current/dirdat/ff
D2W /u02/app/oracle/db/ggs/current/dirdat/ff F4W /u02/app/oracle/db/ggs/current/dirdat/ff