文字列が別の列に存在できる場合

文字列が別の列に存在できる場合

IPの最初の3つのオクテットに基づいて名前付きファイルからawk情報を取得しようとしています。このファイルでは、IPは列2または列4にあります。 IPが2列にある場合は、2列の内容を印刷してから、1列の内容を印刷したいと思います。 IPが4列にある場合は、4列と1列を印刷します。 (サーバー名の列1)。

以下は、すべての列を印刷する出力の例です。

awk /10.1.49/ /var/named/internal/Domain/abc.com

出力は次のとおりです。

server01      IN      A       10.1.49.29  
server02      IN      A       10.1.49.80  
;globalname01.abc.com   10.1.49.60  
;globalname02.abc.com   10.1.49.61

IP列に基づいてソートしてから、IPとサーバー名を印刷したいと思います。

10.1.49.20  server01  
10.1.49.60  globalname01.abc.com  
10.1.49.61  globalname02.abc.com  
10.1.49.80  server02  

私はファイルを使って列数を取得し、{print NF}再度読み(必要な場合)ソートする方法を知っています。{print $4 $1}{print $2 $1}

答え1

努力する:

$ awk '$NF~/^10\.1\.49/ {sub(/;/, "", $1); print $NF,$1}' file | sort
10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02

どのように動作しますか?

  • $NF~/^10\.1\.49/ {..}

    最後の列がで始まる行が選択されます10.1.49。これらの行の場合は、中かっこで囲まれたコマンドを実行します。

  • sub(/;/, "", $1)

    中括弧内の最初のコマンドは代替コマンドです。;存在する場合、最初のフィールドから削除されます。

  • print $NF,$1

    これにより、最後のフィールドが印刷され、次に(修正可能)最初のフィールドが印刷されます。

  • sort

    これにより出力がソートされます。 IPアドレスをソートする方法はいくつかありますが、さまざまなソートオプションを使用すると、目的の結果を得るのに役立ちます。

答え2

awk '{ if ($1 ~ /;.*/) { print $2, substr($1, 2); } else { print $4, $1; } }' file  | sort

出力:

10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02

関連情報