Come posso usare sed per prendere solo il nome del server dei nomi dall'output di scavo?

StackOverflow https://stackoverflow.com/questions/1620128

  •  06-07-2019
  •  | 
  •  

Domanda

Lavoro per un'azienda che offre servizi di web hosting e DNS. Stiamo cercando di migrare tutto su nuovi server e spesso ci imbattiamo in file di zona non aggiornati sui nostri server poiché i clienti hanno cambiato i loro server autorevoli con qualcun altro.

Sto cercando di scrivere uno script che controllerà le informazioni whois, ns e SOA per determinare se un dominio ci utilizza ancora come server autorevole.

Sto tentando di utilizzare sed per filtrare l'output di quanto segue in modo da visualizzare solo il nameserver senza il trascinamento ". " ;:

dig +noall +answer soa yahoo.com | sed 's/.*SOA\s*//' | sed 's/\.$//'

Ho cercato in rete, ma la maggior parte degli esempi di comandi sed funziona su " righe " invece di " Parole " ;.

L'output desiderato sarebbe il seguente:

$ dig +noall +answer soa yahoo.com | sed '<Some SED code here>'
ns1.yahoo.com

Eventuali suggerimenti sarebbero utili.

È stato utile?

Soluzione

Anziché utilizzare la rimozione della parte non desiderata, suggerirei di utilizzare una sottoespressione tra parentesi per identificare il bit desiderato, come segue:

dig + noall + answer soa yahoo.com | sed 's /.* SOA \ s * //' | sed 's / ^ \ ([^] * \). . * / \ 1 / g '

Cerca una stringa che inizia con alcuni caratteri non spaziali, seguita da un punto, uno spazio e quindi il resto della linea. Sostituisce quel modello con solo il bit prima del punto (che è la sottoespressione n. 1).

Altri suggerimenti

quando si lavora con dati strutturati, è più facile usare awk

$ dig +noall +answer soa yahoo.com | awk '{sub(/.$/,"",$5);print $5}'
ns1.yahoo.com

Per contare il numero di parole su una riga:

awk '{ print NF }'

Ad esempio:

printf 'foo bar\nbar\nfoo bar zim' | awk '{ print NF }'

Stampe:

2
1
3
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top