/ / Potrzebujesz grep / etc / hosts ze znaną nazwą hosta, a następnie przechwytujesz adres IP dla nazwy hosta z / etc / hosts - regex, linux, bash, dns, hosts

Potrzebujesz grep / etc / hosts ze znaną nazwą hosta, a następnie przechwytujesz adres IP dla nazwy hosta z / etc / hosts - regex, linux, bash, dns, hosts

Potrzebujesz grep / etc / hosts ze znaną nazwą hosta, a następnie przechwytujesz adres IP dla nazwy hosta z / etc / hosts.

Nie jestem programistą i nie wiem jak to zrobić. Mam bardzo ograniczone doświadczenie z regex, ale myślę, że to może jakoś zadziałać Nie używam DNSa, tylko zarządzam plikiem / etc / hosts.

Muszę pobrać plik / etc / hosts ze znaną nazwą hosta, a następnie przechwycić adres IP dla wpisu hosta. Plik hosta ma standardowy format:

Proszę pomóż!

# Sieć serwisowa

192.168.80.192  testsrv01-maint
192.168.80.193  testsrv02-maint
192.168.80.194  testsrv03-maint

# Wyłącza sieć

192.168.120.192  testsrv01-ilo
192.168.120.193  testsrv02-ilo
192.168.120.194  testsrv03-ilo

# Podstawowa sieć danych

192.168.150.192  testsrv01-pri
192.168.150.193  testsrv02-pri
192.168.150.194  testsrv03-pri

# Wtórna sieć danych

192.168.200.192  testsrv01-sec
192.168.200.193  testsrv02-sec
192.168.200.194  testsrv03-sec

Muszę być w stanie przechwycić adres ip ipełny wpis nazwy hosta dla każdego komputera w zmiennej, z której mogę korzystać. Na przykład, przeprowadź przez plik wyglądający tak, aby pasował do "testsrv01 *" i przechwytuj wszystkie adresy IP i nazwę dla tego wyszukiwania. To samo dla "testsrv02 *" i tak dalej.

Odpowiedzi:

9 dla odpowiedzi № 1

Prosta odpowiedź

ip=$(grep "www.example.com" /etc/hosts | awk "{print $1}")


Lepsza odpowiedź Prosta odpowiedź zwraca wszystkie pasujące adresy IP, nawet te w liniach komentarza. Prawdopodobnie chcesz tylko pierwszego dopasowania bez komentarza, w takim przypadku po prostu użyj awk:

ip=$(awk "/^[[:space:]]*($|#)/{next} /www.example.com/{print $1; exit}" /etc/hosts)


Jeszcze jedna rzecz Jeśli w pewnym momencie dbasz o to, aby rozwiązać www.example.com, czy Twój system jest skonfigurowany do używania hostów, dns, itp., To zastanów się nad mniej znaną getent dowództwo:

ip=$(getent hosts "www.example.com" | awk "{print $1}")


Edytuj w odpowiedzi na aktualizację

$ cat script.sh
#!/bin/bash

host_to_find=${1:?"Please tell me what host you want to find"}

while read ip host; do
echo "IP=[$ip] and host=[$host]"
done < <(awk "/^[[:space:]]*($|#)/{next} /$host_to_find/{print $1 " " $2}" /etc/hosts)

$ ./script.sh testsrv01
IP=[192.168.80.192] and host=[testsrv01-maint]
IP=[192.168.120.192] and host=[testsrv01-ilo]
IP=[192.168.150.192] and host=[testsrv01-pri]
IP=[192.168.200.192] and host=[testsrv01-sec]

3 dla odpowiedzi № 2

Możesz użyć grep z a Wyrażenie regularne Perla aby wyprowadzić adres IP docelowej nazwy hosta.

grep -oP "^d{1,3}.d{1,3}.d{1,3}.d{1,3}(?=.*hostname)" /etc/hosts

Wyjaśnienie:

  • ^ znajduje początek linii
  • d{1,3} znajduje jedną do trzech cyfr
  • . znajduje kropkę
  • (?=something) znajduje something ale nie uwzględnia tego w meczu ("zero-szerokość pozytywnego spojrzenia z wyprzedzeniem")
  • . bez poprzedzającego ukośnika odwrotnego znajduje dowolną postać
  • * powtarza poprzednie wyrażenie (w tym przypadku "dowolny znak") zero lub więcej razy

Innymi słowy, znajdzie to serię od czterech do trzycyfrowych liczb rozdzielonych kropkami i wydrukuje je (grep -o) jeśli po nich następuje dowolny ciąg, a następnie hostname), wszystko w jednym wierszu.