ワイルドカード文字を含むテキストを検索[閉じる]

ワイルドカード文字を含むテキストを検索[閉じる]

/etc/hosts少なくとも、次のサーバーを含める必要があるホストのファイルを探しています。

mobile.example.com
more.mobile.example.com

example.comの代わりに

次のワイルドカードを使用して検索したいと思います。

sed// awk// find/単語はgrepword.word.word < path/to/inputfile > path/to/outputfileのように構成されています。[A-Z, a-z, 0-9]

これを行うには、「sed」、「awk」、「find」、または「grep」コードを記述します。

ベストアンサー1

/etc/hosts各IPアドレスエントリには1つ以上のホスト名がある可能性があるため、各ホスト名(つまり、最初のフィールドを除くすべてのエントリ)を調べて、2つ以上の文字が含まれていることを確認する必要があります.

たとえば、

awk '{for (f=2;f<=NF;f++) {if (split($f,array,/\./)>2) {print;last}}}' /etc/hosts

または、読みやすくするために改行とインデントを追加します。

awk '
  {
    for (f=2;f<=NF;f++) {
      if (split($f,array,/\./) > 2) {
        print;
        last;
      }
    }
  }' /etc/hosts

これにより、リテラル文字が2つ以上の/etc/hostsホスト名を含むすべての行が印刷されます。.

入力行の各フィールドを繰り返し、awkの機能を使用してsplit()文字ごとに分割します。.区切り文字で要素に分割された文字列は、常に区切り文字の数よりも要素が1つ多いため、代わりに> 2テストする必要があります>= 2。たとえば、「example」にはそれ自体要素があります。 「example.com」には2つの要素(「example」と「com」)があります。 "mobile.example.com"には3つあります。

split()また、文字列を配列に分割しますが、この操作では戻り値(要素数)にのみ興味があり、配列は無視されます。

スクリプトが見つかったら一つホスト名には複数の.文字が含まれており、行全体を印刷してforループから外して(使用last)、次の入力行に移動します。

おすすめ記事