повторить присвоение значения в bash - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть bash скрипт. Предполагается прочитать файл .txt, содержащий список доменов. Каждый раз, когда он берет одну строку этого файла .txt, находит его IP-адрес и записывает его в вывод:

while IFS= read -r line; do
                ipV= 
                while IFS= read -r ip; do
                        if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
                                ipV="${ip}-"
                        fi
                done < <(dig +short "$line")        
                ipV=${ipV%-}

done < URLs.txt

Моя проблема в том, что иногда "dig + short" $ line "не возвращает В этом случае я хочу повторить действие, пока он, наконец, не найдет IP-адрес (пока ipV не пуст). На самом деле я хочу сделать это:

while IFS= read -r line; do
                ipV= 
                while IFS= read -r ip; do
                        if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
                                ipV="${ip}-"
                        fi
                done < <(dig +short "$line")        
                ipV=${ipV%-}
                if [ -z "$ipV" ] #if empty
                    #repeat the above steps
                else
                    echo "$ipV" >> out.csv
                fi

done < URLs.txt

но так как я новичок в bash, я не знаю, как с этим справиться. Что я могу сделать, чтобы повторить присвоение значения ipV, если оно пустое?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Окружение вашего кода в until l oop достигает узкого запроса:

ipV=
until [[ $ipV ]]; do
  while IFS= read -r ip; do
    [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && ipV+="${ip}-"
  done < <(dig +short "$line")        
done

Я бы также рассмотрел:

set -o pipefail # make an entire pipeline fail if any part fails

while IFS= read -r line; do
  ipV=; retries=10
  until [[ $ipV ]] || (( retries <= 0 )); do
    ipV=$(dig +short "$line" | grep -E '^[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+$' | tr '\n' '-')
    (( --retries ))
  done
  if [[ $ipV ]]; then
    echo "${ipV%-}"
  else
    echo "ERROR: Gave up retrieving IP for $line after 10 retries" >&2
  fi
done <URLs.txt >out.csv
0 голосов
/ 21 февраля 2020

Sed?

$ cat URLs.txt 
stackoverflow.com
google.com
github.com

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt 
151.101.193.69
151.101.129.69
151.101.1.69
151.101.65.69
64.233.164.138
64.233.164.113
64.233.164.101
64.233.164.102
64.233.164.100
64.233.164.139
140.82.118.3

Обновление комментария @CharlesDuffy, я предположил, что OP сам создает этот URLs.txt, нет? Но давайте проверим это.

$ cat URLs.txt
stackoverflow.com
google.com
github.com
$( ls -la )

Даст нам это

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt
151.101.129.69
151.101.193.69
151.101.1.69
151.101.65.69
173.194.222.100
173.194.222.113
173.194.222.101
173.194.222.102
173.194.222.139
173.194.222.138
140.82.118.4
Invalid option: -rw-r--r--
Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]

Use "dig -h" (or "dig -h | more") for complete list of options

Но этот может иметь некоторые плохие последствия

$ cat URLs.txt 
stackoverflow.com
google.com
github.com
| ls -la

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt
151.101.129.69
151.101.193.69
151.101.65.69
151.101.1.69
173.194.222.139
173.194.222.101
173.194.222.102
173.194.222.100
173.194.222.113
173.194.222.138
140.82.118.3
итого 68
drwxr-xr-x  2 ivan ivan  4096 фев 25 09:30 .
drwxr-xr-x 86 ivan ivan 12288 фев 25 08:44 ..
-rw-r--r--  1 ivan ivan  1003 фев 19 17:48 file
-rw-r--r--  1 ivan ivan   393 фев 17 14:45 file2
-rw-r--r--  1 ivan ivan    40 фев 21 09:48 headers
-rw-r--r--  1 ivan ivan    27 фев 21 11:19 id.txt
-rw-r--r--  1 ivan ivan    44 фев 20 11:37 input.txt
-rw-r--r--  1 ivan ivan   121 фев 21 12:16 lines
-rw-r--r--  1 ivan ivan   195 фев  7 17:21 lines.py
-rw-r--r--  1 ivan ivan   160 фев 21 11:53 out
-rw-r--r--  1 ivan ivan   210 фев  7 17:12 output
-rwxr-xr-x  1 ivan ivan   157 фев 21 17:46 test
-rw-r--r--  1 ivan ivan    21 фев 21 17:44 test2
-rw-r--r--  1 ivan ivan    22 фев 21 17:46 test3
-rw-r--r--  1 ivan ivan    49 фев 25 09:30 URLs.txt

И ; также может больно

$ cat URLs.txt 
stackoverflow.com
google.com
github.com
; ls -la

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt
151.101.65.69
151.101.1.69
151.101.129.69
151.101.193.69
173.194.222.100
173.194.222.113
173.194.222.138
173.194.222.101
173.194.222.139
173.194.222.102
140.82.118.4
g.root-servers.net.
h.root-servers.net.
a.root-servers.net.
m.root-servers.net.
i.root-servers.net.
c.root-servers.net.
j.root-servers.net.
l.root-servers.net.
k.root-servers.net.
d.root-servers.net.
f.root-servers.net.
e.root-servers.net.
b.root-servers.net.
итого 68
drwxr-xr-x  2 ivan ivan  4096 фев 25 09:32 .
drwxr-xr-x 86 ivan ivan 12288 фев 25 08:44 ..
-rw-r--r--  1 ivan ivan  1003 фев 19 17:48 file
-rw-r--r--  1 ivan ivan   393 фев 17 14:45 file2
-rw-r--r--  1 ivan ivan    40 фев 21 09:48 headers
-rw-r--r--  1 ivan ivan    27 фев 21 11:19 id.txt
-rw-r--r--  1 ivan ivan    44 фев 20 11:37 input.txt
-rw-r--r--  1 ivan ivan   121 фев 21 12:16 lines
-rw-r--r--  1 ivan ivan   195 фев  7 17:21 lines.py
-rw-r--r--  1 ivan ivan   160 фев 21 11:53 out
-rw-r--r--  1 ivan ivan   210 фев  7 17:12 output
-rwxr-xr-x  1 ivan ivan   157 фев 21 17:46 test
-rw-r--r--  1 ivan ivan    21 фев 21 17:44 test2
-rw-r--r--  1 ivan ivan    22 фев 21 17:46 test3
-rw-r--r--  1 ivan ivan    49 фев 25 09:32 URLs.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...