文字列を含めないように grep スクリプトにフィルターを追加するにはどうすればよいですか?

文字列を含めないように grep スクリプトにフィルターを追加するにはどうすればよいですか?

私はレジストラ情報をドメインの Whois から分離するスクリプトを作成中です。今のところは十分に機能していますが、もう少しクリーンにするために削除したいものがいくつかあります。ほとんどのドメインで機能します。これが私のコードです:

#!/bin/bash
reg=$(whois "stackoverflow.com" | egrep -i 'Registrar|Sponsoring Registrar|Registrant|!internic')
printf "Below is my best attempt at finding the Registrar info:\n"
printf "$reg\n"

出力は次のようになります:

Below is my best attempt at finding the Registrar info:
with many different competing registrars. Go to http://www.internic.net
   Registrar: NAME.COM, INC.
   Sponsoring Registrar IANA ID: 625
registrar's sponsorship of the domain name registration in the registry is
date of the domain name registrant's agreement with the sponsoring
registrar.  Users may consult the sponsoring registrar's Whois database to
view the registrar's reported date of expiration for this registration.
Registrars.

最初の行を切り取るために、文字列「internnic」を除外する疑似コードを grep に追加しました。また、2 番目の「registrar's sponsorship...」などを削除する方法も見つけたいと思っています。

文字列を検出してその行を含めないようにすることは可能ですか? ありがとうございます

答え1

もう 1 つのオプションは、grep の対象をより具体的に指定することです。例:

whois stackoverflow.com | grep -E '^[[:space:]]*(Registr(ar|ant|y)|Sponsoring).*: '

これは、「Registrar」、「Registrant」、「Registry」、または「Sponsoring」の前にオプションの空白で始まり、その後に任意の数 (0 個以上) の任意の文字が続き、その後にコロンとスペースが続く行のみを抽出します。

(ちなみに、これはgrep -E廃止され非推奨となった ではなくを使用しますegrep。どちらも同じことを行います。)

出力:

   Registrar: NAME.COM, INC.
   Sponsoring Registrar IANA ID: 625
Registry Domain ID: 108907621_DOMAIN_COM-VRSN 
Registrar WHOIS Server: whois.name.com 
Registrar URL: http://www.name.com 
Registrar Registration Expiration Date: 2016-12-26T19:18:07Z 
Registrar: Name.com, Inc. 
Registrar IANA ID: 625 
Registry Registrant ID:  
Registrant Name: Sysadmin Team 
Registrant Organization: Stack Exchange, Inc. 
Registrant Street: 110 William St , Floor 28 
Registrant City: New York 
Registrant State/Province: NY 
Registrant Postal Code: 10038 
Registrant Country: US 
Registrant Phone: +1.2122328280 
Registrant Email: [email protected] 
Registry Admin ID:  
Registry Tech ID:  
Registrar Abuse Contact Email: [email protected] 
Registrar Abuse Contact Phone: +1.1 7203101849 

ちなみに、低速ソース (データベース クエリや、whois や http サーバーなどのリモート ソースなど) からのテキストに対して、あらゆる形式のテキスト処理 (正規表現を含む) をテストする場合、slow コマンドを 1 回実行して出力をファイルにリダイレクトし、そのファイルに対してテストすると便利です。目的の結果が得られたら、直接パイプされた (新しい) データでも同じように動作することを確認してください。

例えば

whois stackoverflow.com > so.txt

whois出力に関するその他の便利な機能:

  1. whos の先頭のドメイン ブロックを抽出します (フィールド行は 4 つのスペースで始まり、コロンで終わります)。

    grep -Ei '^[[:blank:]]+.*:[[:blank:]]' so.txt

出力:

   Domain Name: STACKOVERFLOW.COM
   Registrar: NAME.COM, INC.
   Sponsoring Registrar IANA ID: 625
   Whois Server: whois.name.com
   Referral URL: http://www.name.com
   Name Server: CF-DNS01.STACKOVERFLOW.COM
   Name Server: CF-DNS02.STACKOVERFLOW.COM
   Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
   Updated Date: 26-nov-2015
   Creation Date: 26-dec-2003
   Expiration Date: 26-dec-2016
  1. 「ドメイン名」フィールドで始まり、「レジストラ不正使用連絡先電話番号」フィールドで終わる登録者ブロックを抽出します。

    sed -n -e '/^Domain Name:/,/^Registrar Abuse Contact Phone:/p' so.txt

  2. 上記の両方を組み合わせた場合:

    sed -n -e '/^Domain Name:/,/^Registrar Abuse Contact Phone:/p /^[[:blank:]]+.*:[[:blank:]] /p'

  3. 上記のすべての出力は、フィールド区切り文字としてawkコロン ( ) 文字を使用できるその他のテキスト処理ツールを使用して簡単にさらに処理できます。:

答え2

-v フラグを使用します:

reg=`whois stackoverflow.com | egrep -i 'Registrar|Sponsoring Registrar|Registrant' | grep -v internic`

関連情報