Parsing Nagios service config files with awk

Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Parsing Nagios service config files with awk
# 1  
Old 12-20-2010
Parsing Nagios service config files with awk

Hope someone can help, I've been pulling my hair out with this one...

I've written a shell script that does a sanity check on our quite extensive Nagios configuration for anything that needs cleaning up but wouldn't make the Nagios daemon necessarily bork or complain.
One section of the script checks our Nagios 'services' configuration, the definition of these services are spread across multiple config files and are laid out something like this...

define service{
use                     generic-service   ; Name of service template to use
hostgroup_name          liv_citrix_group,lon_citrix_group,liv_exchange_group,lon_exchange_group
service_description     CPU Loading
is_volatile             0
check_period            24x7
max_check_attempts      2
normal_check_interval   10
retry_check_interval    1
contact_groups          t2-admins,t2-mgrs
notification_interval   120
notification_period     t2hours
notification_options    w,c
check_command           ctx_cpu_snmp!comstring 75 85
process_perf_data       1

All definitions for each 'service' are each wrapped in;
define service{


I'm using awk to parse these service definitions and I'm attempting to pulling out 4 lines from each definition and print out each with $1 removed in a '~' separated string, e.g.
CPU Loading~liv_citrix_group,lon_citrix_group~t2-admins,t2-mgrs~ctx_cpu_snmp!comstring 75 85

Thing is that these 4 lines aren't always in the same order within the braces and this is the cause of my woes.
The awk statement I wrote is;
echo "$services" | grep -v '^\#' | awk '
                        /service_description/ { $1="" ; servicedesc=substr($0,2) }
                        /(host_name|hostgroup_name)/ { $1="" ; servicehosts=substr($0,2) }
                        /contact_groups/ { $1="" ; contacts=substr($0,2) }
                        /check_command/ { $1="" ; command=substr($0,2) }
                        { print servicedesc"~"servicehosts"~"contacts"~"command }

...where "$services" is the output of cat'ing all the services config files.

My awk isn't reliable as it isn't coping with these 4 lines being in different orders and some of the strings being printed are wrong (e.g. a string beginning with a "service_description" from one definition ends in a "check_command" from the next definition in the config file).

So my plea is for someone to point out where I'm going wrong because I've reached my awk limits and copious amounts of RTFM'ing isn't coming up with the answers.

Thanks in advance.


Last edited by vinbob; 12-21-2010 at 07:40 AM..
# 2  
Old 12-20-2010
awk '/^define service\{$/,/^}$/{if(/service_description/||(/(host_name|hostgroup_name)/)||/contact_groups/||/check_command/){for(i=2;i<=NF;i++)x=(x)?x" "$i:$i;printf "%s",(/host/)?x:"~"x;x=y}}END{print y}' tst
liv_citrix_group,lon_citrix_group,liv_exchange_group,lon_exchange_group~CPU Loading~t2-admins,t2-mgrs~ctx_cpu_snmp!comstring 75 85

# awk '/^define service\{$/,/^\}$/{if(/service_description/||(/(host_name|hostgroup_name)/)||/contact_groups/||/check_command/){s=(/host/)?y:"~";$1="";A[NR]=substr($0,2)s}}/^\}$/{for(i in A)printf "%s",A[i]}END{print y}' tst
CPU Loading~t2-admins,t2-mgrs~ctx_cpu_snmp!comstring 75 85~liv_citrix_group,lon_citrix_group,liv_exchange_group,lon_exchange_group

# awk '/service_description/ { $1="" ; A[1]=substr($0,2) }/(host_name|hostgroup_name)/ { $1="" ; A[2]=substr($0,2) }/contact_groups/ { $1="" ; A[3]=substr($0,2) }/check_command/ { $1="" ; A[4]=substr($0,2) }/^\}$/{ print A[1]"~"A[2]"~"A[3]"~"A[4] }' tst
CPU Loading~liv_citrix_group,lon_citrix_group,liv_exchange_group,lon_exchange_group~t2-admins,t2-mgrs~ctx_cpu_snmp!comstring 75 85

Add this before the last print :

Last edited by ctsgnb; 12-20-2010 at 04:59 PM..
# 3  
Old 12-21-2010
Of course!

I've gone the route of your 3rd example were I'm conditionally printing the string on the closing brace and notice that you've quite sensibly chosen to use an array of variables. I've changed it slightly so the print occurs when a line ends with the closing brace instead of beginning and ending with a brace, just in case any definitions added in the future are formatted differently.

So my awk now looks like;
echo "$services" | grep -v '^\#' | awk '/service_description/ { $1="" ; A[1]=substr($0,2) }
                        /(host_name|hostgroup_name)/ { $1="" ; A[2]=substr($0,2) }
                        /contact_groups/ { $1="" ; A[3]=substr($0,2) }
                        /check_command/ { $1="" ; A[4]=substr($0,2) }
                        /\}$/ { print A[1]"~"A[2]"~"A[3]"~"A[4] }'

My script is now coming out with correct results.
Thanks muchly.

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. AIX

NAGIOS Service not able to open port on AIX 7.1

I have an AIX 7.1 LPAR where Nagios agent was installed for monitoring. The issue is that when I start the nagios service (ncpa_listener), it starts but does not open the 5693 port it requires for communication. On all other LPARs the service opens the port and is listening. I tried reinstalling... (4 Replies)
Discussion started by: wibhore
4 Replies

2. Red Hat

Nagios is sending "Service Alert: CentOS 5/HTTP is WARNING"

Hello All, I have setup Nagios 3.2.3 on CentOS release 5.7 (Final) with the default config files and added 1 host to it and it is sending "Service Alert: CentOS 5/HTTP is WARNING" frequently, how do you fix this one? what are the additional files that need to be added so that I can monitor the... (0 Replies)
Discussion started by: lovesaikrishna
0 Replies

3. Shell Programming and Scripting

parsing a config file using bash

Hi , I have a config _file that has 3 columns (Id Name Value ) with many rows . In my bash script i want to be able to parse the file and do a mapping of any Id value so if i have Id of say brand1 then i can use the name (server5X) and Value (CCCC) and so on ... Id Name ... (2 Replies)
Discussion started by: nano2
2 Replies

4. Shell Programming and Scripting

Shell script that will compare two config files and produce 2 outputs 1)actual config file 2)report

Hi I am new to shell scripting. There is a requirement to write a shell script to meet follwing needs.Prompt reply shall be highly appreciated. script that will compare two config files and produce 2 outputs - actual config file and a report indicating changes made. OS :Susi linux ver 10.3. ... (4 Replies)
Discussion started by: muraliinfy04
4 Replies

5. Infrastructure Monitoring

Using SMF to register & start a (Nagios) service

I'm trying to register & start a service using SMF on Solaris 10. It's nsca, part of the Nagios monitoring system. I've got nsca running fine as a detached process, and can manually create passive checks via send_nsca. But when I try to run nsca as a daemon, I need some advice. The nsca... (0 Replies)
Discussion started by: lyle
0 Replies

6. Shell Programming and Scripting

Parsing config-file (perl)

Hi, i'm trying to parse a config file that have alot of rows similar to this one: Example value value value What i want to do is to split and save the row above in a hash, like this: Example = value value value Basically i want to split on the first whitespace after the first... (3 Replies)
Discussion started by: mikemikemike
3 Replies

7. Shell Programming and Scripting

Need help parsing config file in ksh

Hi all, I've done some searching here but haven't found exactly what I'm looking for so I thought I'd post up and see if someone can help out. I'm working on a shell script that I would like to store environment variables in an external file. I'm familiar with sourcing a file with variables in... (1 Reply)
Discussion started by: kungfusnwbrdr
1 Replies

8. UNIX for Dummies Questions & Answers

Issue with parsing config variables

I am using MKS tool kit on windows server. One config variable is defined in windows environment and I am trying to use that variable. # Below RootDir is defined in windows RootDir="\\f01\var" # in unix script details="$RootDir/src|$RootDir/tgt" src=`echo $details|awk -F '|' '{print... (1 Reply)
Discussion started by: madhukalyan
1 Replies

9. Shell Programming and Scripting

parsing config file to create new config files

Hi, I want to use a config file as the base file and parse over the values of country and city parameters in the config file and generate separate config files as explained below. I will be using the config file as mentioned below: (config.txt) country:a,b city:1,2 type:b1... (1 Reply)
Discussion started by: clazzic
1 Replies

10. Shell Programming and Scripting

Parsing config file

Hi All, I have a requirement to parse a file. Let me clear you all on the req. I have a job which contains multiple tasks and each task will have multiple attributes that will be in the below format. Each task will have some sequence number according to that sequence number tasks shld... (0 Replies)
Discussion started by: rajeshorpu
0 Replies
Login or Register to Ask a Question

Featured Tech Videos