Mam plik o nazwie, hostlist.txt
który zawiera taki tekst:
host1.mydomain.com
host2.mydomain.com
anotherhost
www.mydomain.com
login.mydomain.com
somehost
host3.mydomain.com
Mam następujący mały skrypt:
#!/usr/local/bin/bash
while read host; do
dig +search @ns1.mydomain.com $host ALL \
| sed -n '/;; ANSWER SECTION:/{n;p;}';
done <hostlist.txt \
| gawk '{print $1","$NF}' >fqdn-ip.csv
Które wyniki fqdn-ip.csv
:
host1.mydomain.com.,10.0.0.1
host2.mydomain.com.,10.0.0.2
anotherhost.internal.mydomain.com.,10.0.0.11
www.mydomain.com.,10.0.0.10
login.mydomain.com.,10.0.0.12
somehost.internal.mydomain.com.,10.0.0.13
host3.mydomain.com.,10.0.0.3
Moje pytanie brzmi: jak usunąć .
tuż przed przecinkiem bez wywoływania sed
lub gawk
ponownie? Czy istnieje krok, który mogę wykonać w ramach istniejących połączeń sed
lub gawk
połączeń, które usuną kropkę?
hostlist.txt
będzie zawierać tysiące hostów, więc chcę, aby mój skrypt był szybki i wydajny.
shell-script
awk
sed
regular-expression
string
Linoob
źródło
źródło
dig +short
nie działa dla Ciebie?Odpowiedzi:
sed
Polecenia,awk
polecenia i usunięcie kropki mogą być wszystkie połączone w jednym poleceniu awk:Lub, jak rozłożone na wiele linii:
Ponieważ
awk
polecenie występuje podone
instrukcji,awk
wywoływany jest tylko jeden proces. Chociaż wydajność może tutaj nie mieć znaczenia, jest to bardziej wydajne niż tworzenie nowego procesu sed lub awk przy każdej pętli.Przykład
Za pomocą tego pliku testowego:
Polecenie powoduje:
Jak to działa
awk domyślnie odczytuje swoje wejście po jednym rekordzie (linii) na raz. Ten skrypt awk używa jednej zmiennej,
f
która sygnalizuje, czy poprzedni wiersz był nagłówkiem sekcji odpowiedzi, czy nie.f{sub(/.$/,"",$1); print $1", "$NF; f=0}
Jeśli poprzedni wiersz był nagłówkiem sekcji odpowiedzi, wówczas
f
będzie to prawda, a polecenia w nawiasach klamrowych zostaną wykonane. Pierwszy usuwa kropkę z pierwszego pola. Drugi drukuje pierwsze pole, a następnie,
, a następnie ostatnie pole. Trzecia instrukcja resetuje sięf
do zera (fałsz).Innymi słowy,
f
tutaj funkcjonuje jako warunek logiczny. Polecenia w nawiasach klamrowych są wykonywane, jeślif
jest niezerowe (co w awk oznacza „prawda”)./ANSWER SECTION/{f=1}
Jeśli bieżący wiersz zawiera ciąg
ANSWER SECTION
, zmiennaf
jest ustawiona na1
(prawda).Tutaj
/ANSWER SECTION/
służy jako warunek logiczny. Sprawdza, czy bieżący pasuje do wyrażenia regularnegoANSWER SECTION
. Jeśli tak, to polecenie w nawiasach klamrowych jest wykonywane.źródło
f
dowolna zmienna lub jestf{}
wyraźną częścią funkcjonalności awk?f
jest dowolną zmienną. Możesz postawić przed{}
złożonymi warunkami logicznymi.f
jest tylko bardzo prostym warunkiem logicznym: to prawda, jeśli niezerowa, fałsz, jeśli zero./ANSWER SECTION/
pełni rolę warunku logicznego, analogicznie do rolif
odgrywanej w pierwszym poleceniu. Zaktualizowałem odpowiedź, aby to omówić.dig
umie czytać w pliku zawierającym listę nazw hostów i przetwarzać je jeden po drugim. Możesz także powiedzieć,dig
aby ukryć wszystkie dane wyjściowe oprócz sekcji odpowiedzi.To powinno dać ci pożądany wynik:
awk
„ssub()
funkcja służy do taśmy dosłownego okres.
od końca pierwszego pola. Następnieawk
drukuje pola 1 i 5 oddzielone przecinkiem.UWAGA: wpisy
hostlist.txt
nierozstrzygnięte są całkowicie odrzucane - nie pojawiają się na stdout LUB stderr.(Testowany na Linuksie i FreeBSD)
źródło
Zmień swoje wywołanie
gawk
na:źródło