Можно ли разделить на два символа, запустив awk только один раз?

Вы, вероятно, столкнулись с проблемами, так как не похоже, что вы правильно указали источник своей среды, если то, что вы опубликовали, является точным. Я также рекомендую вам указать, какую версию Python вы используете, чтобы избежать проблем с совместимостью, когда у вас есть и python2, и python3. Если это не так, отредактируйте свой вопрос, и этот ответ можно будет удалить или отредактировать в свою очередь.

Основы создания виртуальной среды Python 3:

python3 -m venv /path/to/virtual/env
source./path/to/virtual/env/bin/activate

Возможно, вам потребуется сначала установить venv(apt install python3-venv)и помнить, что ваш путь и сама виртуальная среда должны быть местом, в которое у вашего пользователя есть разрешение на запись. В этот момент вы должны находиться в своей виртуальной среде((env) user@host:~$ _).

Вам не нужно sudoс pip. Использование sudoс pipустанавливает пакет глобально/для всей системы -. Это в значительной степени противоречит цели вашей виртуальной среды, которая состоит в том, чтобы изолировать среду Python для разработки и тестирования.Обратитесь к официальному Python и документации по проблемному пакету, если они не устанавливаются должным образом без sudo, так как это может означать, что вам не хватает зависимости или дополнительных конфигураций в вашей виртуальной среде.

В системе Debian 9.8 (Linux 4.9.0 -8 -amd64 )выполнение вышеуказанных шагов, а затем выполнение следующих дало мне следующие результаты:

(env) user@host:~$ pip3 install flask
(env) user@host:~$ pip3 list --format=legacy
Click (7.0)
Flask (1.0.2)
itsdangerous (1.1.0)
Jinja2 (2.10)
MarkupSafe (1.1.1)
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (32.3.1)
Wekzeug (0.15.1)
(env) user@host:~$ python3 --version
Python 3.5.3
7
24.05.2020, 19:18
4 ответа

Для этого очень конкретного случая, не рассматривали ли вы лучшее использование ip? Например:

ip -j -p -f inet a | awk -F \" '/local/ {print $4}'

Это напечатает ip addressкак объект JSON для поиска ключа local, который используется для хранения IP-адреса. Это еще острее, которое вы можете использоватьjq:

ip -j -p -f inet a | jq '.[].addr_info[].local'

Я рекомендую эту последнюю команду, так как она не пострадает от изменений в выводе ip addr. Однако, если вам действительно нравится ваш первоначальный дизайн, я бы выбрал :

.
ip a | awk '/inet / {print substr($2, 1, index($2,"/")-1)}'

или

ip a | awk '/inet / {split($2, addr, "/"); print addr[1]}'

В первой команде мы используем index($2, "/"), чтобы найти, где /находится в $2, а затем используем substrдля создания подстроки. В секундах мы разделяем $2на /и сохраняем их в массиве addr.

10
18.03.2021, 23:33

Вы можете заменить /и следующие символы пустой строкой:

ip a | awk '/inet /{ sub(/\/.*/, "", $2); print $2 }'
7
18.03.2021, 23:33
ip a | awk '/inet / {FS="/"; $0=$2; print $1; FS=" "}'

Первая совпадающая запись разбивается на поля в соответствии с установленным по умолчаниюFS(пробелом ). Затем устанавливается новый FS. Когда мы подставляем $0=$2, снова выполняется расщепление в соответствии с новым FS. Теперь $1содержит то, что нам нужно, мы это печатаем. Наконец, мы устанавливаем FSдля следующей совпадающей записи.

11
18.03.2021, 23:33

На самом деле разделитель полей, который вы определяете с помощью -F, является регулярным выражением. Таким образом, следующая команда должна доставить:

ip a | awk -F'[ /]+' '/inet / {print $3}'
12
18.03.2021, 23:33

Теги

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