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