Вы можете использовать -d -m
для сеанса экрана, чтобы сделать это следующим образом:
ssh myuser@hostname screen -d -m "python somepath.py -s 'potato'"
Это создаст новый сеанс экрана , запустите в нем свою команду и автоматически отключите вас от нее.
Этот параметр задокументирован как
-d -m
Стартовый экран в отключенном режиме. Это создает новый сеанс, но не подключается к нему. Это полезно для сценариев запуска системы.
на странице документации GNU для экрана
awk
, вероятно, самый прямой -инструмент для этой работы.
Из вашего примера входного файла видно (, назовите его foo
), что каждое поле, кроме последнего в строке, имеет запятую, а затем пробел.
Таким образом, чтобы вывести IP-адрес из каждой строки, используйте:
$ awk -F', ' '{print $1}' < foo
Чтобы напечатать идентификационный номер из каждой строки, используйте:
$ awk -F', ' '{print $2}' < foo
Чтобы напечатать имя из каждой строки, используйте:
$ awk -F', ' '{print $3}' < foo
Также можно создать один оператор awk
, который создает выходные данные, объединяющие различные поля ввода:
$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo
После того, как вы просмотрели вывод этого оператора, чтобы убедиться, что он точен и эффективен для ваших целей, вы можете легко выполнить его, передав его в оболочку:
$ awk -F', ' '{print "ssh " $1 " /path/to/myscript.sh " $2 " " $3}' < foo | bash
Использование Миллера (https://github.com/johnkerl/miller/releases/tag/5.4.0), начиная с
169.38.84.49,8695458,Malcolm
23.246.195.8,7589632,Jerry
119.81.134.226,4571286,Basil
Если вам нужны строки, в которых второе поле равно 7589632
mlr --nidx --fs "," filter -S '$2=="7589632"' input.csv
Если вам нужен только первый столбец строк, в которых второе поле равно 7589632
mlr --nidx --fs "," filter -S '$2=="7589632"' then cut -f 1 input.csv
Добавление ответа на основе вашего последнего обновления (SSH на каждый сервер и выполнение одной или нескольких команд, использующих значения идентификатора и имени ).
Начиная с примера файла, подобного этому:
$ cat testfile.txt
192.168.56.1,12345,N1
192.168.56.2,23456,N2
192.168.56.3,34567,N3
Цикл while
с read
может выполнять эту работу:
while IFS=, read -r IP ID NAME; do
echo "ssh $IP myprogram $ID $NAME"
done < testfile.txt
Что дает следующий результат:
ssh 192.168.56.1 myprogram 12345 N1
ssh 192.168.56.2 myprogram 23456 N2
ssh 192.168.56.3 myprogram 34567 N3
Цикл работает следующим образом. Из входного файла каждая строка читается по очереди. В каждой строке содержимое разбивается на разные поля на основе специальной переменной IFS
. Установив IFS=,
, вы разделяете строку при каждом появлении символа ','. Это приведет к тому, что каждая строка будет разделена на три поля.
После этого каждое поле назначается соответствующим переменным IP
, ID
и NAME
. Эти переменные доступны вам внутри тела цикла. В качестве примера я просто распечатываю возможную команду ssh
для каждой строки.
Обратите внимание, что файл CSV, который я использовал в качестве примера, является простым. Если у вас есть более сложный файл CSV, вам нужно будет использовать подходящий парсер CSV, такой как csvkit
.
Мне нравится решение Haxiel, и я добавлю кое-что....
while IFS=, read -r IP ID NAME; do
echo "ssh $IP myprogram $ID $NAME"
done << ENDEND
192.168.56.1,12345,N1
192.168.56.2,23456,N2
192.168.56.3,34567,N3
ENDEND
Вкладыш "perl" one -был бы хорошим потенциальным решением.
Поскольку вы не предоставили нам образец своих данных, я могу только предполагать, что он будет выглядеть примерно так.
В таком случае вы можете запустить следующую строку.
perl -lne '/(\b\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}\b), (\b\d{1,10}\b), (\b\w+\b)/ && print $1' input_file
Измените число в «Печатать $1» на «2» или «3», чтобы распечатать только «ИД» или «ИМЯ» соответственно.