Как извлечь слово после сопоставления с образцом

Я подозреваю, что ваш /dev/md125смонтирован либо в usr/sap/<HANA server ID>/HDB00/backup, либо где-то в этой папке. Если вы хотите узнать наверняка, вы можете запустить

findmnt /dev/md125

Под TARGETвы, скорее всего, увидите каталог в папке usr/sap/<HANA server ID>/HDB00/backup.

В противном случае также возможно, что устройство md смонтировано в другом месте и есть символическая ссылка на него в каталоге backup, но мне это кажется маловероятным, потому что duпо умолчанию не разыменовывает символические ссылки. Чтобы подтвердить, вы можете запустить du -P, который не будет следовать символическим ссылкам (, но опять же, это должно быть поведением по умолчанию в большинстве систем)

Редактировать:

Основываясь на вашем комментарии о том, что findmnt /dev/md125выводит только /hana/shared, я склонен вернуться к своей гипотезе о символической ссылке. Мне пришло в голову, что любая часть полного пути /usr/sap/<HANA server ID>/HDB00/backupможет быть символической ссылкой, поэтому вы можете проверить эти папки с помощью ls -lпросто для быстрой проверки работоспособности (, поскольку следующая команда может занять некоторое время. полный ).

В противном случае вы можете поискать в полном каталоге /usr/sap символическую ссылку на вашу папку /hana/shared с чем-то вроде этого

find /usr/sap -type l -exec stat {} + | grep /hana/shared

Это найдет любые символические ссылки на любую папку внутри /hana/sharedи покажет вам полный путь к символической ссылке и полный путь к ее цели в /hana/shared.

0
28.09.2020, 13:39
4 ответа

Если вы можете использовать sed, вы можете использовать регулярное выражение, чтобы извлечь необходимую часть из третьего столбца, оставив остальное нетронутым.

sed 's/{.*"jjj":"\([^"]*\).*$/\1/g' input.txt

, где мой файл input.txtсодержит:

abc1 abc2 {"abc3":{"jjj":"opt1"}}
xyz1 xyz2 {"xyz3":{"jjj":"opt2"}}
aaa1 aaa2 {"aaa3":{"aaa4:"jjkk"},.....{"jjj":"opt3"}}

Здесь я пытаюсь зафиксировать значение, представленное в двойных -кавычках после "jjj":"и перед следующей закрывающей двойной -кавычкой.

1
18.03.2021, 23:01
$ awk '
{
  print $1, $2, \
   substr($0, 8+match($0, /\{"jjj":"[^"]+"/), RLENGTH-9)
}' input.txt
abc1 abc2 opt1
xyz1 xyz2 opt2
aaa1 aaa2 opt3
1
18.03.2021, 23:01

Предположим, что три поля файла разделены табуляцией -:

$ cut -f 3 file | jq -r '.request.jjj' | paste <( cut -f -2 file ) -
abc1    abc2    opt1
xyz1    xyz2    opt2
ghi1    ghi2    opt3

Это извлекает структуры JSON в третьем поле каждой строки и передает их в jqдля извлечения значения ключа .request.jjjв каждой. Затем эти данные вставляются обратно в третий столбец с помощью paste.

Если данные разделены символами одиночного пробела:

$ cut -d ' ' -f 3- file | jq -r '.request.jjj' | paste -d ' ' <( cut -d ' ' -f -2 file ) -
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3

Обратите внимание, что первый cut, который извлекает структуры JSON, должен использовать -f 3-, а не просто -f 3, чтобы убедиться, что никакие встроенные символы пробела не обрезают данные.

0
18.03.2021, 23:01

Поскольку ваше третье поле выглядит как действительный JSON,вы могли бы рассмотреть что-то подобное сjq:

$ awk -v cmd='jq -r ".. |.jjj? // empty"' '
  {printf "%s%s%s%s",$1,OFS,$2,OFS; print $3 | cmd; close(cmd)}
' file
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3
0
18.03.2021, 23:01

Теги

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