Вы можете использовать команду unix cut, чтобы выбрать vin в data.csv. Затем используйте sort и uniq -d, чтобы найти общие вин-коды в обоих файлах.
В баш:
cut -d',' -f9 > vin_data
sort vin_data vinlist | uniq -d > vin_to_delete
Затем вы можете использовать Python или ваш любимый язык сценариев для создания нового файла. Мой скрипт на питоне.
f=open('data_vin_removed.csv','w')
v=[i.strip() for i in open('vin_to_delete')]
for i in open('data.csv'):
if any([j in i for j in v]):
continue
else:
f.write(i)
f.close()
Это создаст файл со строками data.csv, у которых нет вин в списке вин.
crontab запускает сценарии в среде, отличной от оболочки входа в систему; в частности, PATH может быть другим или неопределенным.
Попробуйте использовать абсолютный путь в командах (lynx, head... )Вы можете получить их с помощью
which <command>
Кроме того, вы должны указать путь к файлу test.log.
Ваш сценарий работает нормально, но он записывает данные в файл с именем test.log
в текущем каталоге. Поскольку вы никогда не используете cd
в своем скрипте, текущий каталог технически находится где угодно, но, скорее всего, это домашний каталог пользователя.
Для записи в test.log
, расположенный в другом месте, либо cd
в правильный каталог в скрипте, либо укажите полный путь к файлу test.log
при перенаправлении на него.
Также обратите внимание на то, что вы выполняете бесполезно много перенаправлений к выходному файлу. Если все выходные данные вашего оператора if
должны быть добавлены в файл журнала, вы также можете сделать
if...; then
...
elif...; then
...
else
...
if >>/path/to/test.log
, который будет перенаправлять весь вывод оператора if
в файл.
Или, если все выходные данные сценария должны быть перенаправлены в файл журнала, вы также можете перенаправить из crontab с помощью
0 * * * * bash /usr/local/bin/test.sh >>/path/to/test.log
(некоторые crontabs поддерживают @hourly
как ярлык для записи 0 * * * *
, кстати, проверьте man 5 crontab
в вашей системе ).
Тег 2>&1
после перенаправления стандартного вывода в файл, чтобы также перенаправить стандартный поток ошибок (, то есть... >/path/to/test.log 2>&1
).
Кроме того, у вас есть /bin/sh
в строке сценария #!
, но вы запускаете сценарий с bash
явно из crontab. Это смущает. Насколько я вижу, в вашем сценарии нетbash
-ничего особенного, поэтому либо запустите его с помощью /bin/sh
из crontab, либо просто сделайте его исполняемым и не указывайте интерпретатор в командной строке. в crontab, чтобы запустить его.
Мой взгляд на ваш сценарий:
#!/bin/sh
now=$(date "+%d-%m-%Y - %H:%M")
logfile=/usr/local/bin/test.log
status=$( lynx -head -source 'https://example.com' | awk 'FNR == 1 { print $2 }' )
case $status in
503)
systemctl restart mydaemon
message='Daemon restarted, site was unavailable'
;;
200)
message='Site is available'
;;
*)
message='Site status is unknown'
esac
printf '%s: %s (status=%s)\n' "$now" "$message" "$status" >>"$logfile"