Рейтинг:1

awk переменные $1 и $2 становятся пустыми

флаг ph

ЦЕЛЬ: ежедневно сравнивать размер нашей структуры каталогов. В папке данных более 990 ТБ, поэтому мне пришлось запустить кучу параллельных операций, чтобы она закончилась за разумное время. Иногда мы видим очень быстрый рост больших объемов данных, и в настоящее время у нас нет хорошего способа увидеть, куда были добавлены данные.

ПРОБЛЕМА: $1 и $2 моего awk ничего не выводят, и одинарные кавычки, которые должны их окружать, также не отображаются.

PRE-EMPTIVE STRIKE: я знаю, что есть НАМНОГО лучшие инструменты для поиска этой информации, и мы работаем над их внедрением. Это должно быть быстрым и грязным пластырем, позволяющим нам справляться с любым быстрым ростом, который происходит, пока не будет установлено надлежащее программное обеспечение для мониторинга. Кроме того, разделителем между двумя значениями в файле журнала является табуляция. Вставка его в этот редактор WYSIWYG преобразовала вкладку в пробелы.

Заранее спасибо за любую помощь, которую вы можете мне оказать!

Снарф


Я пытаюсь сделать следующее (псевдокод)

  • Найдите папки на два уровня глубже в нашей папке данных
  • Создайте структуру каталогов во временной папке, которая отражает структуру папок данных.
  • Создайте файлы журнала в структуре временных папок для каждой из папок, найденных в «найти папки».
  • Заполните эти файлы журнала выводом du -s папок из «найти папки».
  • awk файлы журналов и сборка вставок sql
  • как только вставки sql будут выглядеть правильно, я передам awk в mysql
  • как только данные появятся в mysql, будет легко запросить ежедневную статистику

Скрипт -

DT=`дата +"%Y%m%d"`
БАЗА=/mnt/данные/тест/

find /mnt/data -maxdepth 2 -mindepth 2 -type d -exec sh -c 'mkdir -p "$(dirname '"$BASE$DT"'{}.log)";touch '"$BASE$DT" '{}.журнал; du -S {} > '"$BASE$DT"'{}.log; awk -F'\''\t'\'' '\''{print "INSERT INTO DATE'"$DT"'(folder_size, folder_location) VALUES('\''$1'\'', '\'' $2'\'');"}'\'' '"$BASE$DT"'{}.log' \;

Пример файла журнала -

0 /mnt/data/apps/bog/minio.production-config/.minio/certs/CAs
12 /mnt/data/apps/bog/minio.production-config/.minio/certs
1 /mnt/data/apps/bog/minio.production-config/.minio
1 /mnt/data/apps/bog/minio.production-config

Пример вывода скрипта для этого лог-файла -

ВСТАВИТЬ В ДАТУ20220508(размер_папки, расположение_папки) ЗНАЧЕНИЯ(, );
ВСТАВИТЬ В ДАТУ20220508(размер_папки, расположение_папки) ЗНАЧЕНИЯ(, );
ВСТАВИТЬ В ДАТУ20220508(размер_папки, расположение_папки) ЗНАЧЕНИЯ(, );
ВСТАВИТЬ В ДАТУ20220508(размер_папки, расположение_папки) ЗНАЧЕНИЯ(, );
флаг in
Действительно ли необходимо считать размеры файлов? Разве недостаточно просто контролировать использование диска?
Рейтинг:1
флаг bd

You are deep in quoting hell there.

Your find command passes to sh -c an argument like

mkdir -p "$(dirname /mnt/data/test/20220508/mnt/data/abc/def.log)";touch /mnt/data/test/20220508/mnt/data/abc/def.log; du -S /mnt/data/abc/def > /mnt/data/test/20220508/mnt/data/abc/def.log; awk -F'\t' '{print "INSERT INTO DATE20220508(folder_size, folder_location) VALUES('$1', '$2');"}' /mnt/data/test/20220508/mnt/data/abc/def.log

Now sh parses this, removing one quoting level. It expands the $(dirname /mnt/data/test/20220508/mnt/data/abc/def.log) to /mnt/data/test/20220508/mnt/data/abc, and the variables $1 and $2 in the awk to empty strings (since it didn't receive any positional parameters), giving

mkdir -p /mnt/data/test/20220508/mnt/data/abc;touch /mnt/data/test/20220508/mnt/data/abc/def.log; du -S /mnt/data/abc/def > /mnt/data/test/20220508/mnt/data/abc/def.log; awk -F\t '{print "INSERT INTO DATE20220508(folder_size, folder_location) VALUES(, );"}' /mnt/data/test/20220508/mnt/data/abc/def.log

(I reinserted the single quotes around the awk program text argument for clarity.)

The easiest way out is to create a file for the awk program which you then pass to awk via the -f option. I would then also recommend doing the assignment FS = "\t" in that file instead of using the -F option.

Finally, if you don't have any further use for the log files except for creating the SQL statements, you can simplify your script considerably by piping the output of du directly to awk, like:

DT=`date +"%Y%m%d"`

find /mnt/data -maxdepth 2 -mindepth 2 -type d -exec sh -c 'du -S {} | awk -v DT='$DT' -f /mnt/data/makeinserts.awk' \;

with the file /mnt/data/makeinserts.awk containing the pure awk program:

BEGIN{FS="\t"}
{print "INSERT INTO DATE"DT"(folder_size, folder_location) VALUES('"$1"', '"$2"');"}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.