Вывести только часть строки лога с помощью grep

В конце концов, это ваши данные, так что именно вам решать, следует ли заменить диск или нет. В итоге это просто крутится ржавчина.

Тем не менее, я должен отметить, что, похоже, вы создали пул cat/RAID0, поэтому, если диск выйдет из строя, вы потеряете все. А без зеркала ZFS не может восстановить сбойные файлы --, только сообщает о них.

Если вы видите сообщения об ошибках, отправляемые в системный журнал во время работы очистки, возможно, это связано с тем, что диски облагаются налогом во время проверки контрольных сумм ZFS. А поскольку доступ осуществляется не ко всем данным, скраб может задеть блок, который, по мнению диска, необходимо перераспределить. Или шум на линии. И я не имею в виду Брендана Грегга, кричащего на диски. ;o )Вы заметили проблему с кабелем, возможно, проблема с контроллером или портом также присутствует?

Вы также отметили форум Western Digital. Я видел много «жалоб» на потребительские диски, которые плохо работают с программным или аппаратным RAID. Если ваши данные важны, вы можете подумать об использовании зеркала и, возможно, даже 3-стороннего -зеркала, поскольку дисков не так много, и что-то еще может выйти из строя во время восстановления/восстановления.

Что касается «умных данных», вердикт о том, насколько они «умны» или полезны, вынесен. Я видел, как диски проходят тесты поставщиков, но остаются бесполезными.

3
28.08.2019, 18:26
3 ответа

Если вам нужны все числа после UUIDs in this bucket, вы можете использовать sedвот так:

$ zcat file.gz | sed -n 's/^.*UUIDs in this bucket //p' 
8501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576
6501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576

Или используйте perl и выведите полный оператор SQL:

$ zcat file.gz | perl -ne 'chomp;if(s/^.*UUIDs in this bucket //){@uuids=split(/,/); $k{$_}++ for @uuids} END{ print "insert into sometable (uuid) values (", join ",",map{qq/"$_"/} keys(%k); print ");\n"}' 
insert into sometable (uuid) values ("6135982080116553120","4830289023695906800","8501792126581991569","9040948912536460872","7661719762428556576","8471856544054164043","8306484440313978157","6501792126581991569","5431263453539111247","8073766106536916628");

Или, чуть более разборчиво:

$ zcat file.gz | 
    perl -ne 'chomp;
              if(s/^.*UUIDs in this bucket //){
                @uuids=split(/,/); 
                $k{$_}++ for @uuids
              }
              END{
                print "insert into sometable (uuid) values (", 
                           join ",",map{qq/"$_"/} @uuids; 
                print ");\n"
            }'
insert into sometable (uuid) values ("6501792126581991569","8073766106536916628","4830289023695906800","6135982080116553120","8306484440313978157","9040948912536460872","8471856544054164043","5431263453539111247","7661719762428556576");
4
27.01.2020, 21:11

Если вы хотите/можете использовать инструменты, отличные от grep, вы можете довольно легко сделать это с помощью awk, так как похоже, что вам всегда нужен конец строки. Вы можете напечатать только последнее поле, например:

zcat /mnt/internal-app/logs/internal-app.log_2019-08-2* | awk '/UUIDs in this bucket/ {print $NF}'

Я не знаю, поддерживают ли какие-либо формы zgrepрегулярные выражения в стиле Perl, но предположим, что ваша версия тоже поддерживает, вы могли бы сделать это, например

zgrep -Po 'UUIDs in this bucket \K.*' /mnt/internal-app/logs/internal-app.log_2019-08-2*

, так как \Kуказывает шаблону не считать все до него как часть совпадения. Так что это будет печатать только то, что приходит после матча.

4
27.01.2020, 21:11

Другой perlспособ генерации кода SQL:

zcat -f /mnt/internal-app/logs/internal-app.log_2019-08-2* |
  perl -lne 'BEGIN{$"=q(",")}
             @u = m{(?:UUIDs in this bucket |\G,)\K\d+}g;
             print qq(insert into sometable (uuid) values ("@u");) if @u'
0
27.01.2020, 21:11

Теги

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