AWK.9
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:8k
源码类别:

操作系统开发

开发平台:

C/C++

  1. .CD "awk (en pattern matching language"
  2. .SX "awk fIrulesfR [fIfilefR] ...
  3. .FL "fR(none)"
  4. .EX "awk rules input" "Process fIinputfR according to fIrulesfR"
  5. .EX "awk rules (en  >out" "Input from terminal, output to fIoutfR"
  6. .PP
  7. AWK is a programming language devised by Aho, Weinberger, and Kernighan
  8. at Bell Labs (hence the name).
  9. fIAwkfR programs search files for
  10. specific patterns and performs *(OQactions*(CQ for every occurrence
  11. of these patterns.  The patterns can be *(OQregular expressions*(CQ
  12. as used in the fIedfR editor.  The actions are expressed
  13. using a subset of the C language.
  14. .PP
  15. The patterns and actions are usually placed in a *(OQrules*(CQ file
  16. whose name must be the first argument in the command line,
  17. preceded by the flag fB(enffR.  Otherwise, the first argument on the
  18. command line is taken to be a string containing the rules
  19. themselves. All other arguments are taken to be the names of text
  20. files on which the rules are to be applied, with fB(enfR being the
  21. standard input.  To take rules from the standard input, use fB(enf (enfR.
  22. .PP
  23. The command:
  24. .HS
  25. .Cx "awk  rules  prog.ds+2*s0u"
  26. .HS
  27. would read the patterns and actions rules from the file fIrulesfR
  28. and apply them to all the arguments.
  29. .PP
  30. The general format of a rules file is:
  31. .HS
  32. ~~~<pattern> { <action> }
  33. ~~~<pattern> { <action> }
  34. ~~~...
  35. .HS
  36. There may be any number of these <pattern> { <action> }
  37. sequences in the rules file.  fIAwkfR reads a line of input from
  38. the current input file and applies every <pattern> { <action> }
  39. in sequence to the line.
  40. .PP
  41. If the <pattern> corresponding to any { <action> } is missing,
  42. the action is applied to every line of input.  The default
  43. { <action> } is to print the matched input line.
  44. .SS "Patterns"
  45. .PP
  46. The <pattern>s may consist of any valid C expression.  If the
  47. <pattern> consists of two expressions separated by a comma, it
  48. is taken to be a range and the <action> is performed on all
  49. lines of input that match the range.  <pattern>s may contain
  50. *(OQregular expressions*(CQ delimited by an @ symbol.  Regular
  51. expressions can be thought of as a generalized *(OQwildcard*(CQ
  52. string matching mechanism, similar to that used by many
  53. operating systems to specify file names.  Regular expressions
  54. may contain any of the following characters:
  55. .HS
  56. .in +0.75i
  57. .ta +0.5i
  58. .ti -0.5i
  59. x An ordinary character
  60. .ti -0.5i
  61. \ The backslash quotes any character
  62. .ti -0.5i
  63. ^ A circumflex at the beginning of an expr matches the beginning of a line.
  64. .ti -0.5i
  65. $ A dollar-sign at the end of an expression matches the end of a line.
  66. .ti -0.5i
  67. &. A period matches any single character except newline.
  68. .ti -0.5i
  69. * An expression followed by an asterisk matches zero or more occurrences
  70. of that expression: *(OQfo**(CQ matches *(OQf*(CQ, *(OQfo*(CQ, *(OQfoo*(CQ, *(OQfooo*(CQ, etc.
  71. .ti -0.5i
  72. + An expression followed by a plus sign matches one or more occurrences 
  73. of that expression: *(OQfo+*(CQ matches *(OQfo*(CQ, *(OQfoo*(CQ, *(OQfooo*(CQ, etc.
  74. .ti -0.5i
  75. [] A string enclosed in square brackets matches any single character in that 
  76. string, but no others.  If the first character in the string is a circumflex, the 
  77. expression matches any character except newline and the characters in the 
  78. string.  For example, *(OQ[xyz]*(CQ matches *(OQxx*(CQ and *(OQzyx*(CQ, while 
  79. *(OQ[^xyz]*(CQ matches *(OQabc*(CQ but not *(OQaxb*(CQ.  A range of characters may be 
  80. specified by two characters separated by *(OQ-*(CQ.
  81. .in -0.75i
  82. .SS "Actions"
  83. .PP
  84. Actions are expressed as a subset of the C language.  All
  85. variables are global and default to int's if not formally
  86. declared.  
  87. Only char's and int's and pointers and arrays of
  88. char and int are allowed.  fIAwkfR allows only decimal integer
  89. constants to be used(emno hex (0xnn) or octal (0nn). String
  90. and character constants may contain all of the special C
  91. escapes (\n, \r, etc.).
  92. .PP
  93. fIAwkfR supports the *(OQif*(CQ, *(OQelse*(CQ, 
  94. *(OQwhile*(CQ and *(OQbreak*(CQ flow of
  95. control constructs, which behave exactly as in C.
  96. .PP
  97. Also supported are the following unary and binary operators,
  98. listed in order from highest to lowest precedence:
  99. .HS
  100. .ta 0.25i 1.75i 3.0i
  101. .nf
  102. fB Operator Type AssociativityfR
  103. () [] unary left to right
  104. .tr ~~
  105. ! ~ ++ (en(en (en * & unary right to left
  106. .tr ~
  107. * / % binary left to right
  108. + (en binary left to right
  109. << >> binary left to right
  110. < <= > >= binary left to right
  111. == != binary left to right
  112. & binary left to right
  113. ^ binary left to right
  114. | binary left to right
  115. && binary left to right
  116. || binary left to right
  117. = binary right to left
  118. .fi
  119. .HS
  120. Comments are introduced by a '#' symbol and are terminated by
  121. the first newline character.  The standard *(OQ/**(CQ and *(OQ*/*(CQ
  122. comment delimiters are not supported and will result in a
  123. syntax error.
  124. .SP 0.5
  125. .SS "Fields"
  126. .SP 0.5
  127. .PP
  128. When fIawkfR reads a line from the current input file, the
  129. record is automatically separated into *(OQfields.*(CQ  A field is
  130. simply a string of consecutive characters delimited by either
  131. the beginning or end of line, or a *(OQfield separator*(CQ character.
  132. Initially, the field separators are the space and tab character.
  133. The special unary operator '$' is used to reference one of the
  134. fields in the current input record (line).  The fields are
  135. numbered sequentially starting at 1.  The expression *(OQ$0*(CQ
  136. references the entire input line.
  137. .PP
  138. Similarly, the *(OQrecord separator*(CQ is used to determine the end
  139. of an input *(OQline,*(CQ initially the newline character.  The field
  140. and record separators may be changed programatically by one of
  141. the actions and will remain in effect until changed again.
  142. .PP
  143. Multiple (up to 10) field separators are allowed at a time, but
  144. only one record separator.
  145. .PP
  146. Fields behave exactly like strings; and can be used in the same
  147. context as a character array.  These *(OQarrays*(CQ can be considered
  148. to have been declared as:
  149. .SP 0.15
  150. .HS
  151. ~~~~~char ($n)[ 128 ];
  152. .HS
  153. .SP 0.15
  154. In other words, they are 128 bytes long.  Notice that the
  155. parentheses are necessary because the operators [] and $
  156. associate from right to left; without them, the statement
  157. would have parsed as:
  158. .HS
  159. .SP 0.15
  160. ~~~~~char $(1[ 128 ]);
  161. .HS
  162. .SP 0.15
  163. which is obviously ridiculous.
  164. .PP
  165. If the contents of one of these field arrays is altered, the
  166. *(OQ$0*(CQ field will reflect this change.  For example, this
  167. expression:
  168. .HS
  169. .SP 0.15
  170. ~~~~~*$4 = 'A';
  171. .HS
  172. .SP 0.15
  173. will change the first character of the fourth field to an upper-
  174. case letter 'A'.  Then, when the following input line:
  175. .HS
  176. .SP 0.15
  177. ~~~~~120 PRINT "Name         address        Zip"
  178. .SP 0.15
  179. .HS
  180. is processed, it would be printed as:
  181. .HS
  182. .SP 0.15
  183. ~~~~~120 PRINT "Name         Address        Zip"
  184. .HS
  185. .SP 0.15
  186. Fields may also be modified with the strcpy() function (see
  187. below).  For example, the expression:
  188. .HS
  189. ~~~~~strcpy( $4, "Addr." );
  190. .HS
  191. applied to the same line above would yield:
  192. .HS
  193. ~~~~~120 PRINT "Name         Addr.        Zip"
  194. .HS
  195. .SS "Predefined Variables"
  196. .PP
  197. The following variables are pre-defined:
  198. .HS
  199. .in +1.5i
  200. .ta +1.25i
  201. .ti -1.25i
  202. FS Field separator (see below).
  203. .ti -1.25i
  204. RS Record separator (see below also).
  205. .ti -1.25i
  206. NF Number of fields in current input record (line).
  207. .ti -1.25i
  208. NR Number of records processed thus far.
  209. .ti -1.25i
  210. FILENAME Name of current input file.
  211. .ti -1.25i
  212. BEGIN A special <pattern> that matches the beginning of input text.
  213. .ti -1.25i
  214. END A special <pattern> that matches the end of input text.
  215. .in -1.5i
  216. .HS
  217. fIAwkfR also provides some useful built-in functions for string
  218. manipulation and printing:
  219. .HS
  220. .in +1.5i
  221. .ta +1.25i
  222. .ti -1.25i
  223. print(arg) Simple printing of strings only, terminated by '\n'.
  224. .ti -1.25i
  225. printf(arg...) Exactly the printf() function from C.
  226. .ti -1.25i
  227. getline() Reads the next record and returns 0 on end of file.
  228. .ti -1.25i
  229. nextfile() Closes the current input file and begins processing the next file
  230. .ti -1.25i
  231. strlen(s) Returns the length of its string argument.
  232. .ti -1.25i
  233. strcpy(s,t) Copies the string *(OQt*(CQ to the string *(OQs*(CQ.
  234. .ti -1.25i
  235. strcmp(s,t) Compares the *(OQs*(CQ to *(OQt*(CQ and returns 0 if they match.
  236. .ti -1.25i
  237. toupper(c) Returns its character argument converted to upper-case.
  238. .ti -1.25i
  239. tolower(c) Returns its character argument converted to lower-case.
  240. .ti -1.25i
  241. match(s,@re@) Compares the string *(OQs*(CQ to the regular expression *(OQre*(CQ and 
  242. returns the number of matches found (zero if none).
  243. .in -1.5i
  244. .SS "Authors"
  245. .PP
  246. fIAwkfR was written by Saeko Hirabauashi and Kouichi Hirabayashi.