Поскольку вы отметили свой вопрос perl
, один из способов сделать это в perl будет заключаться в использовании того факта, что perl tr
возвращает количество замененных символов; так, например (взяв N = 13
), вы могли бы сделать
perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Возможно, более традиционным способом было бы оценить соответствие регулярного выражения в скалярном контексте, чтобы получить счет
perl -ne '$c = () = /\d/g; print unless $c > 13' file
См., например, Есть ли ярлык Perl для подсчета количества совпадений в строке?
Если пакет не делает что-то сумасшедшее или требует много времени при импорте, вы можете попробовать его на самом деле импортировать:
if python -c "import package_name" &> /dev/null; then
echo 'all good'
else
echo 'uh oh'
fi
Я использовал немного более строгую версию ответа Антона для использования в скрипте:
pip3 list |
grep -v "^Package *Version$" | grep -v "^-*$" |
cut -d ' ' -f 1 |
grep -xF "$package_name"
Первые два grep предназначены для удаления строк заголовка из вывода pip3.
Затем разрез выбирает только имена пакетов (, отбрасывая номера версий ).
Затем финальная команда grep может выполнить точный поиск соответствующих$package_name
Если пакет найден, он отобразит имя пакета и вернется с кодом выхода 0. Если вы не хотите видеть имя пакета, завершите команду>/dev/null
Вы также можете использовать что-то подобное в своих скриптах.
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
Что вы получите, если пакет не установлен.
Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1
Что вы получите после установки пакета.
Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0
Работает в python2 и python3, а затем вы устанавливаете на основе кода выхода.
Я нашел существующие ответы неполными и не имеющими достаточно хороших примеров. Вот решение, на котором я остановился:
# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
echo 'pandas found'
else
echo 'pandas not found'
fi
Суть этого примера на Github можно найти здесь:https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6
Проверено с pip3:
$> pip3 show MODULENAME
Выход -код ($? )будет "0", если модуль установлен, иначе "1".
У Греппинга есть проблема "ложных срабатываний". :Вывод
pip list | grep NAME
будет соответствовать любому модулю, имя которого содержит «ИМЯ», например. также соответствует «какой-то _другой _ИМЯ».
Пока
pip3 show MODULENAME
совпадения только при полных совпадениях.
Мне нужно было это внутри моего сценария bash, поэтому в итоге я использовал:
CHECK1=$(<package_name> --version)
CHECK1=$(echo $CHECK1 | awk '{print $1}')
# or:
CHECK1=$(pip freeze | grep <package_name>)
CHECK1=$(echo $CHECK1 | awk '{print $1}' | awk -F '==' '{print $1}')
Например:
# Check if the virtualenv exists.
CHECK1=$(virtualenv --version)
CHECK1=$(echo $CHECK1 | awk '{print $1}')
После этого я могу использовать $CHECK1 в операторе if для автоматизации других действий.
if [[ $CHECK1 = 'virtualenv' ]]
then
echo "Yes virtualenv library exists"
else
echo "No it does not exist... "
#.... you can later ask the user to install it or not...
Предположительно, если имя библиотеки не будет изменено, этот сценарий должен работать, чтобы проверять любую библиотеку, существует она или нет.
Чтобы расширить ответ Томаса Хофманна, поскольку pip3 show
возвращает ненулевой код выхода для пакетов, которые не установлены, вы можете выполнить то, что хотите, с помощью:
if pip3 show package_in_question &> /dev/null; then
run_program
fi