Получение значений из файла, разделенного запятыми

Вы можете использовать -d -m для сеанса экрана, чтобы сделать это следующим образом:

ssh myuser@hostname screen -d -m "python somepath.py -s 'potato'"

Это создаст новый сеанс экрана , запустите в нем свою команду и автоматически отключите вас от нее.

Этот параметр задокументирован как

-d -m
Стартовый экран в отключенном режиме. Это создает новый сеанс, но не подключается к нему. Это полезно для сценариев запуска системы.

на странице документации GNU для экрана

0
11.04.2019, 11:27
5 ответов

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
2
28.01.2020, 02:22

Использование Миллера (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
0
28.01.2020, 02:22

Добавление ответа на основе вашего последнего обновления (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.

1
28.01.2020, 02:22

Мне нравится решение 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
0
28.01.2020, 02:22

Вкладыш "perl" one -был бы хорошим потенциальным решением.

Поскольку вы не предоставили нам образец своих данных, я могу только предполагать, что он будет выглядеть примерно так.

  • 169.38.84.49, 8695458, Малькольм
  • 23.246.195.8, 7589632, Джерри
  • 119.81.134.226, 4571286, Василий

В таком случае вы можете запустить следующую строку.

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», чтобы распечатать только «ИД» или «ИМЯ» соответственно.

0
28.01.2020, 02:22

Теги

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