smistrip
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:4k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. #!/bin/sh
  2. #
  3. # smistrip --
  4. #
  5. # Extract MIB modules from text files, like RFCs or I-Ds.
  6. #
  7. # This is variant of smistrip from libsmi-0.2, modified to be somewhat
  8. # more aggressive in suppressing blank lines, and support the -x option.
  9. #
  10. # Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
  11. # Modified by Niels Baggesen
  12. #
  13. # See the file "COPYING" for information on usage and redistribution
  14. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  15. #
  16. # $Id: smistrip,v 5.2.2.1 2005/02/08 20:07:35 nba Exp $
  17. #
  18. # NOTE, that this script relies on awk (tested with GNU awk) and getopts
  19. # (shell builtin like in bash or standalone).
  20. #
  21. AWK=awk
  22. [ `uname` != SunOS ] || AWK=/usr/bin/nawk
  23. GETOPTS=getopts
  24. VERSION=0.3-cvs
  25. do_version () {
  26.     echo "smistrip $VERSION"
  27. }
  28. do_usage () {
  29.     echo "Usage: smistrip [-Vhn] [-d dir] [-s suffix] [-m modules] file ..."
  30.     echo "-V         show version and license information"
  31.     echo "-v         verbose"
  32.     echo "-h         show usage information"
  33.     echo "-n         do not write module files"
  34.     echo "-d dir     write module to directory dir"
  35.     echo "-x suffix  append suffix to the module file name"
  36.     echo "-m modules strip only the specified modules. For a list of modules"
  37.     echo "           use : as a separator"
  38.     echo "file ...   input files to parse (RFCs, I-Ds, ...)"
  39. }
  40. do_strip () {
  41.     cat $1 | $AWK -v test="$test" -v dir="$dir" -v single="$single" -v suffix="$suffix" -v verbose="$verbose" '
  42.     BEGIN {
  43. if (length(single) != 0) {
  44.     single = ":"single":"
  45. }
  46. else {
  47.     single = ""
  48. }
  49.     }
  50.     END {
  51. if (single != "" && single != ":") {
  52.     gsub(":", " ", single)
  53.     print "WARNING: Module(s) not found:" single
  54. }
  55.     }
  56.     # start of module
  57.     /^[ t]*[A-Za-z0-9-]* *DEFINITIONS *::= *BEGIN/ {
  58. module = $1
  59. collect = 1
  60. macro = 0
  61. n = 0
  62.     }
  63.     # page footer - start skipping
  64.     /[Page [iv0-9]*] */ {
  65.         collect = 0
  66. next
  67.     }
  68.     /^[ t]*(::=|DESCRIPTION|SYNTAX|MAX-ACCESS|MIN-ACCESS|ACCESS|STATUS|REFERENCE|INDEX|AUGMENTS|DEFVAL|UNITS|DISPLAY|")/ {
  69. if (collect)
  70.     if (line[n-1] == "") n--
  71.     }
  72.     # a blank line - suppress multiple
  73.     /^[ tr]*$/ {
  74.         if (collect)
  75.     if (line[n-1] != "" && line[n-1] !~ /,[ tr]*$/) line[n++] = ""    
  76. next
  77.     }
  78.     # collect non-blank line when inside mib module
  79.     /[^ ft]/ {
  80. if (length(module) > 0) {
  81.     if (!collect)
  82. collect = 1 # page header, stop skipping
  83.     else
  84. line[n++] = $0
  85. }
  86.     }
  87.     # remember when we enter a macro definition
  88.     / *MACRO *::=/ {
  89. macro = 1
  90.     }
  91.     # end of module
  92.     /^[ t]*END[ tr]*$/ {
  93. if (macro)
  94.     macro = 0
  95. else if (single == "" || match(single, ":"module":")) {
  96.     sub(":"module, "", single)
  97.     strip = 99
  98.     for (i = 0 ; i < n ; i++) {
  99. # find the minimum column that contains non-blank characters
  100. # in order to cut a blank prefix off.
  101. p = match(line[i], "[^ ]")
  102. if (p < strip && length(line[i]) > p) strip = p
  103.     }
  104.     if (test != "1") {
  105. if (dir)
  106.     f = dir "/" module suffix
  107. else
  108.     f = module suffix
  109. for (i = 0 ; i < n ; i++)
  110.     print substr(line[i], strip) >f
  111.     }
  112.     if (verbose) {
  113. print module ": " n " lines."
  114.     }
  115.     module = ""
  116.     collect = 0
  117. }
  118. else
  119.     print "NOTE: " module ": ignored."
  120.     }
  121.     '
  122. }
  123. while $GETOPTS Vvhnm:d:x: c ; do
  124.     case $c in
  125. v) verbose=1
  126. ;;
  127. n) test=1
  128. ;;
  129. m) single=$OPTARG
  130. ;;
  131. d) dir=$OPTARG
  132. ;;
  133. x) suffix=$OPTARG
  134. ;;
  135. h) do_usage
  136. exit 0
  137. ;;
  138. V) do_version
  139. exit 0
  140. ;;
  141. *) do_usage
  142. exit 1
  143. ;;
  144.     esac
  145. done
  146. shift `expr $OPTIND - 1`
  147. if [ $# -eq 0 ] ; then
  148.     do_strip -
  149. else 
  150.     for f in $@ ; do
  151. do_strip $f
  152.     done
  153. fi
  154. exit 0