1

そして私の質問を検討してくれてありがとう!

私はこの形式のnagios設定ファイルを持っています:

define host{
    use             generic-camera
    host_name       camera_7
    alias           camera facing the 7th door at headquarters
    address         172.16.202.21
    parents         hq_switch
    hostgroups      cameras,fixed-cameras
    }

私が達成したいのは、sedを使用してIPアドレスを照合し、その前の行にテキストを追加することです。正規表現に一致する行にテキストを追加する方法については多くの提案を見てきましたが、前の行に追加する方法については説明していません。アドレスの下にリストされているIPのMACアドレスをエイリアス行に追加したいと思います。これは、sedが実行された後に確認したいことです。

define host{
    use             generic-camera
    host_name       camera_7
    alias           camera facing the 7th door at headquarters MAC 00:01:02:aa:bb:cc
    address         172.16.202.21
    parents         hq_switch
    hostgroups      cameras,fixed-cameras
    }

IPと一致させる必要がある理由は、bashスクリプトがそのアドレスからデバイスの正しいMACを取得するためです。

私もawkを利用できますが、これはawkがsedよりもクリーンに書き込む場合です。

あなたの提案をありがとう。

4

4 に答える 4

0

awkの使用:

awk 'NR>1{if ($0 ~ "^ *address") print x " MAC 00:01:02:aa:bb:cc"; else print x};
   {x=$0} END{print x}' in-file

編集:ハードコーディングの代わりにスクリプトを介してIPアドレスからMacアドレスを取得する:

awk 'NR>1{if ($0 ~ "^ *address") {"arp "$2 | getline line; split(line, tok, " ");
    print x " MAC " tok[4];} else print x};{x=$0} END{print x}' in-file
于 2013-03-08T20:49:19.077 に答える
0

使用sed

sed -n '
  ## Set label 'a'.
  :a

  ## Read and save every line until we find the IP.
  /172\.16\.202\.21/! { 
    N
    ba 
  }

  ## Append the MAC just before the last '\n' (previous line).
  s/^\(.*\)\n/\1 MAC 00:01:02:aa:bb:cc\n/

  ## Print all saved until now.
  p

  ## Remove all printed.
  s/^.*$//

  ## Enter a loop to save all content until end of file.
  :b
  $! { 
    N
    bb 
  }

  ## Remove the additional '\n' added by the 'N' command and print.
  s/\n//
  p

' infile

それは以下をもたらします:

define host{
    use             generic-camera
    host_name       camera_7
    alias           camera facing the 7th door at headquarters MAC 00:01:02:aa:bb:cc
    address         172.16.202.21
    parents         hq_switch
    hostgroups      cameras,fixed-cameras
    }
于 2013-03-08T20:51:02.497 に答える
0

試してみる別のsed:

sed '/alias/{N; /[^0-9]172\.16\.202\.21$/s/\n/ MAC 00:01:02:aa:bb:cc&/;}' file
于 2013-03-09T12:38:32.893 に答える
0

IPアドレスフィールドのドットをエスケープする必要性を感じませんでした。ファイルには、IPアドレスではない数字の長い文字列を含むスポットがないため、をリッピングしました。私のことを単純化するためにマッチングします。私が助けを求めたsed行と結合されたシェルスクリプトは次のようになります。

#!/bin/bash
for (( h = 200; h <= 204; h++ ))
do
for (( j = 1; j <= 150; j++ ))
do
i="172.16.$h.$j"
mac=`grep $i\  /proc/net/arp |awk '{print $4}'`

sed "/alias/{N; /[^0-9]$i\$/s/\n/ MAC $mac&/;}" $1 >> ${1}.new1
done
done

grep -A4 -B4 MAC ${1}.new1 > ${1}.new2
sed -i "s/^--//g" ${1}.new2

sed -n -e '1,/host/p' /usr/local/nagios/etc/objects/${1} |sed '$d' > ${1}.top
grep -B4 -A999 HOST\ GROUP\ DEF /usr/local/nagios/etc/objects/${1} > ${1}.tail

mkdir -p new
cat ${1}.top ${1}.new2 ${1}.tail > new/${1}

同じことを行うためのよりクリーンな方法があると確信していますが、これは私が現在の(確かに低レベルの)スキルで作業するようになったものです。特に、各出力ファイルは1つのホストのみを変更し、ファイルごとに数百もある場合があるため、数百のホストのうち1つだけを変更してすべてを分割し、その1つの変更を処理して他の場所に吐き出す必要があります。クリーンアップしましたが、他の誰かがこの問題に遭遇した場合、これは機能するはずです。少なくとも私にとっては機能しましたが、YMMVです。

于 2013-03-10T13:37:17.413 に答える