#!/bin/sh # @(#) readinfo 1.3 92/08/31 @(#) # reads a host database file # # input from stdin # output to stdout # # arguments are names of fields in the file # # fields in a file are defined by a comment line of the form # #FIELDS <field_description> ... # # where <field_description> is the name of the field followed by optional # keyword parameters of the form parameter=<value> # three paramaters are supported in this script # prefix - prefix added to value of the field # suffix - suffix added to value of field # no - character to prevent adding a prefix or suffix to a field # # fields in the file are separated with white space. Embedded blanks in fields # are either escaped with a '\' or the entire field is quoted with double quotes # The prefix or suffix can be overridden by prepending or following the value # with the ``no='' character # Copyright (c) 1992 by Texas Internet Consulting # This code may be freely copied and used so long as this # copyright notice is attached. This code may not be sold # without the express written permission of Texas Internet Consulting. # Texas Internet Consulting makes no warranty as to the correctness # nor the applicability of this code for any purpose. # get the fields from the command line - will be funnelled to awk fields="$*" # change whitespace to tabs and handle quoted fields and escaped blanks # also remove comment lines, except the #FIELDS line awk ' BEGIN { # get around double quote bug dq = sprintf("%c", 34) } /^#FIELDS/ || ( ! /^#/ && ! /^$/ && ! /^[ ][ ]*/ ) { # line has double quotes or backslashes if ($0 ~ /"/ || $0 ~ /\\/) { # print everything up to field with double quote or backslash l = length($0) n = 0 for (i=1; i<=NF; i++) { if ($i !~ /"/ && $i !~ /\\/) { printf("%s\t", $i) } n += length($i) n++ } remainder = substr($0, n+1, l-n) l -= n quoted = 0 escaped = 0 for (i=1; i<=l; i++) { sub = substr(remainder, i, 1) if (sub == dq) { if (quoted) { quoted = 0 } else { quoted = 1 } } else if (sub == "\\") { escaped = 1 } else if (quoted) { printf("%s", sub) } else if (escaped) { printf("%s", sub) escaped = 0 } else if (sub == " ") { printf("\t") } else { printf("%s", sub) } } } # line is just a bunch of normal fields else { for (i=1; i<=NF; i++) { printf("%s", $i) if (i < NF) { printf("\t") } } } printf("\n") }' | # read file and output fields wanted awk -F' ' ' # get the fields from the command line BEGIN { EXTRACT="'"$fields"'" nextract = split(EXTRACT, extract, " ") } # extract field definition info from file /^#FIELDS/ { nfields = 0 for (i=2; i<=NF; i++) { # field is a paramter if ($i ~ /\=/) { n = split($i, part, "=") keyword = part[1] value = part[2] # prefix if (keyword == "prefix") { prefix[nfields] = value } # suffix else if (keyword == "suffix") { suffix[nfields] = value } else if (keyword == "no") { no[nfields] = value } } #field name else { nfields++ fields[nfields] = $i prefix[nfields] = "" suffix[nfields] = "" no[nfields] = "" } } } # process a record ! /^#/ && ! /^$/ && ! /^[ ][ ]*/ { # scan the list of fields to extract and compare them with the # list in the file and print as they are encountered for (i=1; i<=nextract; i++) { for (j=1; j<=nfields; j++) { if (fields[j] == extract[i]) { break } } if (j > nfields) { printf("***ERROR*** field not found - %s\n", extract[i]) continue } if (i > 1) printf(" ") # no overide character for this field if (no[j] == "") { printf("%s%s%s", prefix[j], $j, suffix[j]) continue } # overide character exist - split up the field n = length($j) first = substr($j, 1, 1) last = substr($j, n, 1) # no overide character in field value if (first != no[j] && last != no[j]) { printf("%s%s%s", prefix[j], $j, suffix[j]) continue } middle = "" if (n >= 3) { middle = substr($j, 2, n-2) } if (first != no[j]) { printf("%s%s", prefix[j], first) } printf("%s", middle) if (last != no[j]) { printf("%s%s", last, suffix[j]) } } printf("\n") }'