15 октября 2023 Bash curl awk sort uniq egrep white read


Если необходимо проверить большое количество ссылок на сайте то можно воспользоваться вот таким bash скрипт

site=http://127.0.0.1:8080

curl $site 2> /dev/null | egrep -o 'href="[^"]+"' | awk -F\" '{print $2}' | grep /catalog/ | sort | uniq | while read u; do 
curl  $site$u -o /dev/null -w "%{http_code} $u\n" -s 
done >> check-menu.txt 

Данный скрипт

  • скачивает главную страницу сайта: curl $site
  • затем  выбирает все ссылки href: egrep -o 'href="[^"]+"'
  • выбирает содержимое аттрибута href: egrep -o 'href="[^"]+"'
  • отбирает ссылки содержащие /catalog/: grep /catalog/
  • сортирует и отбирает только уникальные ссылки: sort| uniq
  • в цикле запрашивает кажду ссылку и сохраняет статус ссылки в файл check-menu.txt ;

13 октября 2023 Bash awk while read


Имеет большое количество файлов которые могут повторяться по содержимому и стоит задача оставить только уникальные файлы по содержимому. Для определения уникальности будем использовать контрольную сумму md5, а для автоматизации bash скрипт

#!/bin/bash

echo Чистка от дублей

x="" 

ls /tmp/base_1s-202* |sort  | while read f; do  
    _x=$(md5sum $f|awk '{print $1}')
    if [ $_x == "$x" ]; then 
        echo удаление $f  $_x
        rm $f 
    else 
        x=$_x
        echo сохранение $_x $f
    fi
done

 


29 августа 2023 Bash awk haproxy


Задача, выделить из логов haproxy статусы запросов, бакенды обработчиков и урлы запросов, так же выводить количество счётчик статусов запросов

tail -f /var/log/haproxy-traffic.log |awk -F' ' '{if (NF == 20)  print $11,'\t', ++count[$11],'\t', $9, $19 }'

Программа awk состоит из условия и инкремента счётчика

if (NF == 20)  print $11,'\t', ++count[$11],'\t', $9, $19 }

здесь отбираются строки состоящие из 20 слов, выводится status_code запроса, а так же результат инкремента счётчика статусов

подобным образом можно организовать подсчёт количества обращений к бакенду и ссылкам

if (NF == 20)  print $11,'\t', ++count[$11],'\t',++count[$19],'\t',  $9, ++count[$19],'\t',  $19 }

 


10 октября 2022 СуБД awk


for t in $(echo \\dt | psql $BASE |grep public |awk '{print $3}'); do 
    echo "SELECT setval('$t"_id_seq"', (select max(id)+1 from $t), true);"; 
done | psql $BASE

Суть проблемы в том, что при репиликации таблицы значение последовательности таблицы автоматически не меняется, по этому после отключения репликации значение last_insert_id будет отставать от реального количество записей в таблице


19 июля 2022 СуБД awk


После неудачного эксперимента с бекапами база данных может содержать по несколько копий каждой строки таблицы, это приводит любой ORM в ступор, впрочем и руками удалить такие записи не полуться, так записи имеют одинаковые ID. Ниже решение как легко удалить дубли и оставить только по одной уникальной строке
 

table_name=auth_users

data_base=breys

echo "
begin;

select count(1) from $table_name ;

create  table ttt as select distinct id x,  * from $table_name ;

alter table ttt drop  column x;

truncate table $table_name; 

insert into $table_name (select * from ttt );

drop table ttt ;

select count(1) from $table_name ;

end;
" | psql $data_base

Суть метода такова:

  1. создать копию таблицы содержающую только уникальные по ID записи, для этого используется DISTINCT,
  2. затем нужно удалить сигнальное поле x
  3. почистить целевую таблицу
  4. затем перенести данные из временной таблицы в целевую
  5. удалить временную таблицу

Если необходимо обработать все таблицы базы данных то скрипт можно использовать в цикле

for table_name in $(echo '\dt' | psql $data_base | awk '{print $3}'| grep -v ^$|sort ); do  

echo "
begin;

select count(1) from $table_name ;

create  table ttt as select distinct id x,  * from $table_name ;

alter table ttt drop  column x;

truncate table $table_name; 

insert into $table_name (select * from ttt );

drop table ttt ;

select count(1) from $table_name ;

end;
" | psql $data_base; 

done

с помощь транзакций можно предовратить удаление данных в случае проблемного импорта


22 апреля 2021 26 августа 2022 СуБД Postgresql psql bash awk for drop table cascade | решать тесты

  • Знаете ли вы другой способ удаления группы таблиц в Postgres


Скрипт каскадного удаления таблиц в psql
 

for t in $(echo '\dt' | psql $data_base |awk -F\| '{print $2}'); do 
    echo "drop table $t cascade;" ; 
done | psql $data_base

Суть скрипта проста:

  • echo '\dt' | psql $database # выводит список таблиц базы данных из переменной $database
  • awk -F\| '{print $2}' # вывести второй столбец из списка
  • do echo "drop table $t cascade;" ; done # тело цикла формирующее набор SQL команд
  • | psql $database # выполнить SQL код