найти шаблон и обновить запись первым вхождением этого шаблона

В «современной» системе вы можете использовать systemd-resolve.

Со страницы руководства:

systemd-resolve may be used to resolve domain names, IPv4 and IPv6 addresses, DNS resource records and services with the systemd-resolved.service(8) resolver service. By default, the specified list of parameters will be resolved as hostnames, retrieving their IPv4 and IPv6 addresses. If the parameters specified are formatted as IPv4 or IPv6 operation the reverse operation is done, and a hostname is retrieved for the specified addresses.

Он будет выполнять DNS, тогда как getent, в зависимости от nsswitch.conf, может даже не выполнять DNS-запросы. Вы также можете передать опцию --type, чтобы иметь доступ к любому типу записи DNS.

1
24.10.2019, 19:23
2 ответа

НЕ элегантный. Только для информационных целей.

Сначала определите все identifier1записи
команда1:grep '^identifier1' my_file_name
Это напечатает только строк с выбранным вами тегом. Позже вы можете искать записи с другим идентификатором.

Когда у вас есть эти записи, вы можете искать только столбец 14 с помощью команды вырезания :
. команда2:_command1_ | cut -c14
Для ясности я использую сокращенную запись команд. Надеюсь, они имеют смысл для вас.
command2 использует команду cut для печати только 14-го символа(-cдля символа ).

Затем вы можете искать «Y» в этом выводе.
command3:_command2_ | grep -q Y-q говорит "Тихо" --ничего не выводить.
rc=$?Примечание. :Некоторые говорят, что вам не нужен rc, достаточно посмотреть на $?. Ваш звонок. В этот момент, если $rc (или $? )равно 0, grep нашла хотя бы одну Y в верхнем регистре. В противном случае будет 1 (возможны другие числа, указывающие на ошибку ).

Давайте закодируем вот так:
if [ $rc -ne 0 ] then echo "No Ys found" exit fi
Обратите внимание на :, если вы помещаете ЛЮБЫЕ команды между grep -q Yи if, вы ДОЛЖНЫ использовать rc=$?. В противном случае $? Это хорошо.

Чтобы изменить ВСЕ индикаторы для N на Y, вы должны запустить эту команду sed:

sed -i "/^identifier1/ s/\(………….\).\(.*\)/\1Y\2/" my_file_name

В -iнаписано В -место редактирования файла.
/^identifier1/говорит, что совпадают только строки, начинающиеся с indetifier1
sозначает поиск и замену. SearchFor находится после / Заменить на после следующей косой черты.
SearchFor :Вам нужен 14-й символ. Есть элегантный способ сделать это в sed .Я оставлю это для других людей, чтобы объяснить. Простой ответ::
-точка -означает любой символ. Таким образом, 13 точек означают соответствие первым 13 символам. Поскольку мы хотим сохранить их -в неприкосновенности, мы будем хранить их в ведре. Это (и)--экранированные круглые скобки. Так:
/\( 13 dots \). \( dot * \)скажите, возьмите первые 13 символов строки и сохраните их в Bucket #1. точка означает соответствие 1 символу. точечная звезда говорит: «Сопоставьте 0 или более символов» --, т.е. все остальное --, и сохраните его в ведре #2.

Теперь о замене:
/\1Y\2/говорит Замените строку содержимым Bucket #1, затем Y и затем Bucket #2.

Есть способ очистить это и сделать его более эффективным. У меня нет Linux передо мной, и я не могу вспомнить, как это сделать.
Когда некоторые другие FAB публикуют это, вы должны быть в состоянии понять это сейчас.

0
27.01.2020, 23:40

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

Предполагается, что ваш идентификатор имеет длину 11 символов и что вы ищете строки с Yв качестве 15-го символа (, как в вашем примере ). Если идентификатор не всегда состоит из 11 символов, то необходимо изменить первую строку скрипта.

Первый проход :Сохраните первую запись для каждого идентификатора в массиве и измените этот элемент массива, если найдена запись с Y.

Второй проход :Заменить строку первой записи для каждого идентификатора сохраненным и, возможно, измененным значением массива и распечатать строку.

awk '{
  ident=substr($0,0,11)  # get identifier
  if (NR==FNR){          # first pass
    if (!(ident in a)){  # if identifier is not present in array
      a[ident]=$0        # save current line in array
    }
    if (substr($0,15,1) == "Y"){  # if `Y` is found in current line
                                  # replace character with `Y` in array value
      a[ident]=substr(a[ident],0,14)"Y"substr(a[ident],16)
    }
  }
  else {               # second pass
    if (ident in a){   # if identifier is present in array
      $0=a[ident]      # replace current line
      delete a[ident]  # delete array element
    }
    print              # print current line
  }
}' file file
1
27.01.2020, 23:40

Теги

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