#awk #upgrade #yum
Вопрос:
Я хотел бы получить размер обновлений Linux с yum
помощью .
Для apt я сделал это:
`def get_upgradable() : #récupère la list des paquets
command = "apt list --upgradable 2>/dev/null"
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, encoding='utf8')
packages_name = []
for out in process.stdout :
if "/" in out :
packages_name.append(out[:out.index('/')])
return packages_name
def get_size(*args, return_somme=True) : #fait la somme du poids de chaque paquets
command = "apt-cache --no-all-versions show {pkg} | grep "^Size" | cut -d' ' -f2"
sizes = []
somme = 0
for pkg in args :
size = int(
subprocess.Popen(command.format(pkg=pkg), shell=True, stdout=subprocess.PIPE, encoding='utf8'
).stdout.read())
sizes.append(size)
somme = size
if return_somme : return somme
return sizes
somme=get_size(*get_upgradable())`
И я пробую это, но я не знаю, как получить только размер :
yum check-update | awk '/S s [0-9]S s S / {print $1 }' > updates
Комментарии:
1. Эй, я опубликовал ответ, из вашего вопроса я понял, что нужно получить информацию о размере пакетов, как вы ясно упомянули об этом. Так что это может быть связано с обработкой текста. Вот почему мой ответ
awk
-это решение. Вам это помогает?
Ответ №1:
# yes N | yum update | awk '{if($5=="k"||$5=="M") print $1,$4,$5}' > checksize.txt
Я посмотрел на распечатанный результат yum check-update
команды, но там, похоже, не указан размер загрузки (обновления). Так что в основном;
yum update
Вместо этого запустите, который выводит информацию о размере загрузки.- Затем
N
заранее отправьте ключ в запрос на подтверждение загрузки, чтобы избежать какой-либо загрузки. if
инструкция предназначена для того, чтобы избежать печати строк, которые не содержат информации о размере.- Чтобы напечатать только размер, кроме имен пакетов, просто удалите
$1,
команду «Печать».
ВЫВОД (с head
и tail
):
# cat -n checksize.txt | (head; tail)
1 centos-linux-release 22 k
2 kernel 5.9 M
3 kernel-core 36 M
4 kernel-modules 28 M
5 PackageKit 599 k
6 PackageKit-command-not-found 27 k
7 PackageKit-glib 140 k
8 PackageKit-gstreamer-plugin 17 k
9 PackageKit-gtk3-module 18 k
10 abattis-cantarell-fonts 156 k
886 subscription-manager-rhsm-certificates 260 k
887 cups-ipptool 5.8 M
888 oddjob-mkhomedir 49 k
889 openssh-askpass 92 k
890 python3-html5lib 214 k
891 python3-pexpect 138 k
892 python3-tracer 123 k
893 elfutils-debuginfod-client 65 k
894 kpatch-dnf 17 k
895 memstrack 48 k
Если вам нужен только общий размер загрузки:
# yes N | yum update | awk -F": " '/^Total download size/{print $2}'
1.0 G
Комментарии:
1. Привет, спасибо, это мне помогло. Но на самом деле у меня не такой же результат.
2. С некоторыми изменениями это будет работать. Так что еще раз спасибо вам 🙂
3. @бастьен, каков результат при выполнении последней команды? Это ошибка корневых привилегий?
4. Я попробовал еще раз, и все работает так, как ожидалось. но это займет некоторое время, так что подождите еще немного
5. У меня нет вывода с последней командой. И просто : «Тайл : 951 М» с первым. Это ОС Redhat.
Ответ №2:
Поэтому мы с другом работаем над этим и обновляем решение. Напоминание : Я отправляю скрипт python на сервер, чтобы получить размер обновления.
def get_upgradable() :
if os.path.isfile("/usr/bin/apt"):
command = "apt list --upgradable 2>/dev/null | cut -d'/' -f1"
elif os.path.isfile("/usr/bin/yum"):
#command = "yum check-update 2>/dev/null | grep ".x86_64" | cut -d' ' -f1"
command="yum check-update | awk '/S s [0-9]S s S / {print $1 }'"
else :
raise PkgManager("Not found package manager")
return None
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, encoding='utf8')
packages_name = []
for out in process.stdout :
packages_name.append(out[:-1])
return packages_name
def get_yum_size(*args, return_somme=True) :
command = "yum info {pkg} | egrep "(Taille|Size)""
factor = {"k" : 1000,
"M" : 1000000,
"G" : 1000000000}
somme = 0
sizes = []
for pkg in args :
lines = subprocess.Popen(command.format(pkg=pkg),
shell=True,
stdout=subprocess.PIPE,
encoding='utf8',
).stdout.readlines()
infos = lines[-1][:-1].split(' ')
size = float(infos[-2])*factor[infos[-1]]
sizes.append(size)
somme = size
if return_somme : return somme
return sizes
Вы называете это с :
def get_size(*args, **kwargs) :
if os.path.isfile("/usr/bin/apt"):
return get_apt_size(*args, **kwargs)
elif os.path.isfile("/usr/bin/yum"):
return get_yum_size(*args, **kwargs)
else :
raise PkgManager("Not found package manager")
И в основном :
get_size(*get_upgradable())