Извлечение атрибута ID из структурированного текстового файла для всех записей с атрибутом определенного типа

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
0
31.08.2021, 13:29
4 ответа

Прочтите man grep awkи выполните что-то вроде:

grep -B1 -w -i "hub" test | \
  grep -i "interface:" | \
  awk '{print $1}'
0
31.08.2021, 13:46
grep -B 1 "Type:Hub" test* | grep "interface:" | awk '{print $1}'
0
31.08.2021, 13:46

Следующая 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, чтобы гарантировать, что информация о том, что осталось -больше, не испортит синтаксический анализ.
  • В конце -файла -делаем то же самое.
0
31.08.2021, 14:01
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
0
02.09.2021, 06:58

Теги

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