В Bash, как читать файл и принимать каждую строку как инкрементную переменную?

У меня есть файл, как показано ниже: (list.txt)

127.0.0.1 us
127.0.0.2 uk
127.0.0.3 cn
127.0.0.4 fr
127.0.0.5 ru
127.0.0.6 bd
127.0.0.7 hk

Я хотел создать скрипт, который покажет пользователю как выбранные элементы.

bash ping.sh
Which ip you want to test?

1) 127.0.0.1-us
2) 127.0.0.2-uk
3) 127.0.0.3-cn
4) 127.0.0.4-fr
5) 127.0.0.5-ru
6) 127.0.0.6-bd
7) 127.0.0.7-hk

Input: 6

ping -c 5 127.0.0.6

] Этот список будет меняться при каждом изменении файла. Как я могу это сделать?

1
задан 26 March 2016 в 11:48

3 ответа

[F1]
2
ответ дан 23 May 2018 в 12:35
  • 1
    @kos хорошее пятнистость. Я положил выход перед cat, думая, что не имеет значения, изменилось ли количество строк list.txt. Но да, положив его после, лучше, его просто собираются добавить к выходу кошки – the_velour_fog 26 March 2016 в 11:58
  • 2
    Нет, извините, на самом деле это была довольно пустая жалоба. Я просто неправильно читал код и думал, что это не сработало бы так (неправильно, оно действительно работает). – kos 26 March 2016 в 12:05

Предполагая, что в bash вы имели в виду команду cli (терминал) для выполнения задания. Конечно, только коммуникационная секция выполняется python, сама команда (конечно) выполнена ping

Все в одном, в маленьком скрипте python:

#!/usr/bin/env python3
import subprocess
import sys

print("Which ip do you want to test?\n")
# create a numbered list of the lines
ips = list(enumerate(open(sys.argv[1]).read().splitlines()))
[print(str(i+1)+") "+ip) for i, ip in ips]
# run the command to ping
subprocess.call(["ping", "-c", "5", ips[int(input("\ninput: "))-1][1]])
Скопируйте сценарий в пустой файл, сохраните его как ping_ip.py Запустите его с аргументом list.txt в качестве аргумента:
python3 /path/to/ping_ip.py /path/to/list.txt`

Примечание

Аргумент «5» ( количество пинов) находится в строке:

subprocess.call(["ping", "-c", "5", ips[int(input("\ninput: "))-1][1]])

, но может быть очень хорошо изменено для использования в качестве аргумента communicationational . Если это будет удобно, просьба указать.

1
ответ дан 23 May 2018 в 12:35
  • 1
    Я искал сценарий оболочки. Но этот, похоже, работает ... я проверю, может ли я отлично реализовать ... Спасибо. – Fahad Ahammed 26 March 2016 в 11:23
  • 2
    @FahadAhammed, если вам нужны какие-либо изменения, разные виды вывода или что-то еще, все можно сделать. – Jacob Vlijm 26 March 2016 в 11:32

Вот что я придумал примерно через 5-10 минут, просто играя с AWK.

$ select entry in $(awk '{printf "%s-%s ",$1,$2}'  ips.txt) ; do                                      
> ip_address=$(awk -F '-' '{print $1}' <<< "$entry" )                                                                 
> echo "You selected "  "$ip_address"
> done
1) 127.0.0.1-us
2) 127.0.0.2-uk
3) 127.0.0.3-cn
4) 127.0.0.4-fr
5) 127.0.0.5-ru
6) 127.0.0.6-bd
7) 127.0.0.7-hk
#? 2
You selected  127.0.0.2

Трудная часть вашего вопроса - это просто обработка строк текстового файла, который может быть соответствующим образом использован структурой select, потому что у вас есть две записи в строке. Ну, почему бы не превратить их в один элемент и просто отправить процесс для извлечения ip-адреса? Это именно то, что я делаю в коде выше.

Обратите внимание, что первая подстановка параметров не задана без кавычек - мы хотим, чтобы первая команда расширялась до каждого отдельного элемента, разделенного пробелами, мы не хотим, чтобы он рассматривался как одна строка.

Что хорошего в этом подходе, так это то, что он невосприимчив к отсутствующему местоположению, например, если в выборе # 2 uk отсутствует, мы все равно будем читать 127.0.0.2

0
ответ дан 23 May 2018 в 12:35

Другие вопросы по тегам:

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