Как установить gawk -csv (и gawkextlib )?

Поскольку вы создаете свои собственные лог-файлы и вам требуется более реальное -измельчение размера по времени, вам следует взглянуть на утилиту Apache rotatelogsздесь .

Он работает, читая стандартный ввод, и нарезает файл журнала на основе аргументов командной строки.

напр.

program-writing-to-stdout|/bin/rotatelogs /home/mike/tmp/qqq.log 1M"

logrotate , с другой стороны, проверяет файлы журналов при запуске, и обычно системы настроены на запуск logrotate (через cron )один раз в день. Конфигурация подсистем -обычно выполняется путем перетаскивания файла конфигурации в /etc/logrotate.d, и да, обычно он запускается от имени пользователя root.

Редактировать :@mike грызун

logrotateзапускается (с помощью cron или вручную ), а затем проверяет статистику файла журнала, как показано в файловой системе -, затем запускает ротацию в зависимости от своей конфигурации.

rotatelogsсчитывает стандартный ввод, непрерывно добавляя к файлу журнала, затем, когда время или размер файла журнала достигает триггерной точки -, он закрывает текущий файл журнала, создает новый файл журнала (с соответствующим именем ), затем продолжает добавляться в новый файл журнала.

Это имеет отношение к тому, как вы запускаете программу, которая генерирует выходные данные, она должна записывать в стандартный вывод, а затем вы передаете это в журналы rotatelog.

например,

while true ; do date ; sleep 30 ; done | rotatelogs -n 10 /home/mike/tmp/qqq.log 60

Дает вам круговое вращение через 10 файлов, разрезая каждые 60 секунд

Используя rclone, я ожидаю, что --log-file "/dev/stdout"заставит его записывать в стандартный вывод.

[править 2] @mike грызун

Я не знаком с rclone, пишет ли он в stdout или stderr, и если что-то пишет в любой из них, но есть способы обойти это, даже если --log-file=/dev/stdoutне работает.

Этот StackOverflow Q/Answer среди прочего объясняет перенаправление и конвейерную передачу. Но подводя итог, можно перенаправить только stderr или объединить с stdout в канал.

Пример Баша:

Объединить stderr с stdout в канал

FirstCommand 2>&1 | OtherCommand

Только stderr в канал, stdout в otherfile (, который может быть /dev/null или даже просто дефисом -, который закрывает stdout ).

FirstCommand 2>&1 1>otherfile.log | otherCommand

В этих примерах используется старый синтаксис bash, bash v4 имеет современный, менее подробный вариант.

1
25.03.2020, 23:53
2 ответа

Этот рецепт сработал для меня прямо сейчас. YMMV.

Измените DSTPATHна место, где вы хотите установить это расширение.

Я НЕ рекомендую устанавливать вообще что-либо вручную в системные каталоги (, например. под/usr); это должно управляться только инструментами дистрибутива (apt, yumи т. д. ).

DSTPATH=/tmp/baz
set -e
git clone https://git.code.sf.net/p/gawkextlib/code gawkextlib-code
cd gawkextlib-code/lib
autoreconf -i
./configure --prefix=$DSTPATH && make -j13 install
cd../csv
autoreconf -i
./configure --prefix=$DSTPATH --with-gawkextlib=$DSTPATH && make -j13 install

export AWKPATH=$DSTPATH/share/awk AWKLIBPATH=$DSTPATH/lib/gawk
echo foo,bar,baz | gawk -i csv 'csvsplit($0,a){print a[2]}'

Все это, ИМХО, излишне, и есть тысячи причин, по которым это может привести к сбою (отсутствие надлежащих инструментов разработки и т. д. ).

2
19.03.2021, 02:32

Отложив дискуссию об установке в /usr -Основная проблема, которую я обнаружил при сборке библиотеки csv, заключается в том, что в Makefile не указан путь среды выполнения , необходимый для поиска gawkextlib при компоновке csv.soбиблиотека. Это означает, что без установки LD_LIBRARY_PATHcsv.soне найдет libgawkextlib.so.0во время выполнения, даже если сборка и установка будут выполнены успешно. Результатом является такая ошибка при вызове gawk:

gawk: csv:15: fatal: load_ext: cannot open library `/usr/local/lib/gawk/csv.so' (libgawkextlib.so.0: cannot open shared object file: No such file or directory)

gawk находит csv.soв /usr/local/lib/gawk/csv.so, но csv.soзатем зависит от libgawkextlib.so.0, который не находится на пути к библиотеке времени выполнения.

Я не смог найти вариант в configureдля решения этой проблемы и в итоге снова запустил строку ссылки из вывода make, но добавил следующее :-Wl,-rpath,/usr/local/lib

-Wlотправляет следующие опции прямо на ссылку из gcc.

Таким образом, полная строка :gcc -shared -fPIC -DPIC .libs/csv.o.libs/csv_parser.o.libs/csv_convert.o.libs/csv_split.o.libs/csv_input.o.libs/strbuf.o.libs/awk_fieldwidth_info.o -L/usr/local/lib/ -Wl,-rpath,/usr/local/lib -L/usr/local/bin -lgawkextlib -g -O2 -Wl,-soname -Wl,csv.so -o.libs/csv.so

После этого csv.soсмог найти libgawkextlib.so.0без моих манипуляций с путем поиска библиотеки:

$ ldd csv.so 
        linux-vdso.so.1 (0x00007ffda36e6000)
        libgawkextlib.so.0 => /usr/local/lib/libgawkextlib.so.0 (0x00007ffb8f535000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffb8f144000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ffb8f93d000)

Таким образом, общая процедура для меня на Ubuntu 18.04 была следующей: я использовал версию gawk, ранее собранную из исходного кода и установленную по адресу /usr/local/bin/gawk. Также обратите внимание, что у меня уже установлены все инструменты сборки, вам может понадобиться использовать aptдля установки gcc, autoconf, libtool и т. д. -хорошей отправной точкой является sudo apt install build-essential.

Получить источник:

git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib
cd gawkextlib

Build lib -здесь ничего особенного-with-gawkпросто гарантирует, что мы используем нашу скомпилированную версию gawk,не системная версия:

cd lib
autoreconf -i
./configure --with-gawk=/usr/local/bin/
make
sudo make install

Расширение сборки csv с патчем для библиотеки:

cd../csv
autoreconf -i
./configure --with-gawk=/usr/local/bin/ --with-gawkextlib=/usr/local/lib/
make
gcc -shared  -fPIC -DPIC .libs/csv.o.libs/csv_parser.o.libs/csv_convert.o.libs/csv_split.o.libs/csv_input.o.libs/strbuf.o.libs/awk_fieldwidth_info.o   -L/usr/local/lib/ -Wl,-rpath,/usr/local/lib -L/usr/local/bin -lgawkextlib  -g -O2   -Wl,-soname -Wl,csv.so -o.libs/csv.so
sudo make install

Успех:

$ echo foo,bar,baz | gawk -i csv 'csvsplit($0,a){print a[2]}'
bar

Последняя подсказка -, если у вас есть проблемы с makeinfoне установленными -на Ubuntu:

sudo apt-get install texinfo
0
19.03.2021, 02:32

Теги

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