Rsync не может делать это на уровне отдельных файлов, но в некоторой степени поддерживает создание целых деревьев. Например.:
/path/to/dst-2019-07-31/file
/path/to/dst-2019-07-30/file
/path/to/dst-2019-07-29/file
...
Есть три варианта:
--compare-dest=DIR
где в новом каталоге создаются только новые файлы. Вероятно, это не то, что вам нужно, потому что вам придется перечислить все каталоги предыдущей версии. --copy-dest=DIR
, где неизмененные файлы копируются из DIR
в место назначения, а не передаются из источника. --link-dest=DIR
— то же самое, но использует гораздо меньше дискового пространства в месте назначения, поскольку не дублирует содержимое файла. Вы используете это так:
rsync -a --link-dest=/path/to/dst-$YESTERDAY /path/to/src /path/to/dst-$TODAY
Прочтите man grep awk
и выполните что-то вроде:
grep -B1 -w -i "hub" test | \
grep -i "interface:" | \
awk '{print $1}'
grep -B 1 "Type:Hub" test* | grep "interface:" | awk '{print $1}'
Следующая awk
программа должна выполнять:
awk '$1~/^Type/{split($1,f,/:/);t=f[2]} $2~/^interface/{if (id && t~/Hub/) print id; id=$1; t=""} END{if (id && t~/Hub/) print id}' test.txt
Предполагается, что формат строго такой, как показано, без дополнительных пробелов (, в частности вокруг :
оператора Type
и/
).
Type
, мы разбиваем строку в :
на массив f
и сохраняем вторую запись как переменную t
. interface
, мы сохраняем первое «Слово» (идентификатора маршрутизатора ). Перед этим проверяем, не был ли уже сохранен идентификатор маршрутизатора из предыдущей записи. Если это так, мы печатаем предыдущий идентификатор, если предыдущий тип содержит слово «Hub». Мы также сбрасываем t
, чтобы гарантировать, что информация о том, что осталось -больше, не испортит синтаксический анализ. sed -e 'N; y/\n/ /' -e '/Type:Hub/!d; s/.*//' file
Это объединяет пару строкinterface:
-Type:
вместе, так что после N; y/\n/ /
строка sed
содержит такие строки, как
abc23 interface: Tunnel000 Type:Hub
aqw789 interface: Tunnel222 Type:Spoke
ert458 interface: Tunnel111 Type:Spoke
ijf689 interface: Tunnel333 Type:Hub
jkl412 interface: Tunnel000 Type:Hub/Spoke
kli456 interface: Tunnel111 Type:Hub
(N
добавляет следующую строку в буфер, а y/\n/ /
заменяет встроенный символ новой строки между двумя строками пробелом.)
Остальная часть команды sed
удаляет все строки, не соответствующие Type:Hub
, а затем все оставшиеся строки, начиная с первого символа пробела. /Type:Hub/!d
удаляет ненужные строки, а s/.*//
обрезает строки до первого пробела.
В итоге вы получите
abc23
ijf689
jkl412
kli456