awk
Statements Versus Lines
Most often, each line in an awk
program is a separate statement or
separate rule, like this:
awk '/12/ { print $0 } /21/ { print $0 }' BBS-list inventory-shipped
However, gawk
will ignore newlines after any of the following:
, { ? : || && do else
A newline at any other point is considered the end of the statement.
(Splitting lines after `?' and `:' is a minor gawk
extension. The `?' and `:' referred to here is the
three operand conditional expression described in
section Conditional Expressions.)
If you would like to split a single statement into two lines at a point where a newline would terminate it, you can continue it by ending the first line with a backslash character, `\'. The backslash must be the final character on the line to be recognized as a continuation character. This is allowed absolutely anywhere in the statement, even in the middle of a string or regular expression. For example:
awk '/This regular expression is too long, so continue it\ on the next line/ { print $1 }'
We have generally not used backslash continuation in the sample programs
in this book. Since in gawk
there is no limit on the
length of a line, it is never strictly necessary; it just makes programs
more readable. For this same reason, as well as for clarity, we have
kept most statements short in the sample programs presented throughout
the book. Backslash continuation is most useful when your
awk
program is in a separate source file, instead of typed in on
the command line. You should also note that many awk
implementations are more particular about where you may use backslash
continuation. For example, they may not allow you to split a string
constant using backslash continuation. Thus, for maximal portability of
your awk
programs, it is best not to split your lines in the
middle of a regular expression or a string.
Caution: backslash continuation does not work as described above
with the C shell. Continuation with backslash works for awk
programs in files, and also for one-shot programs provided you
are using a POSIX-compliant shell, such as the Bourne shell or Bash, the
GNU Bourne-Again shell. But the C shell (csh
) behaves
differently! There, you must use two backslashes in a row, followed by
a newline. Note also that when using the C shell, every newline
in your awk program must be escaped with a backslash. To illustrate:
% awk 'BEGIN { \ ? print \\ ? "hello, world" \ ? }' -| hello, world
Here, the `%' and `?' are the C shell's primary and secondary prompts, analogous to the standard shell's `$' and `>'.
awk
is a line-oriented language. Each rule's action has to
begin on the same line as the pattern. To have the pattern and action
on separate lines, you must use backslash continuation--there
is no other way.
Note that backslash continuation and comments do not mix. As soon
as awk
sees the `#' that starts a comment, it ignores
everything on the rest of the line. For example:
$ gawk 'BEGIN { print "dont panic" # a friendly \ > BEGIN rule > }' error--> gawk: cmd. line:2: BEGIN rule error--> gawk: cmd. line:2: ^ parse error
Here, it looks like the backslash would continue the comment onto the next line. However, the backslash-newline combination is never even noticed, since it is "hidden" inside the comment. Thus, the `BEGIN' is noted as a syntax error.
When awk
statements within one rule are short, you might want to put
more than one of them on a line. You do this by separating the statements
with a semicolon, `;'.
This also applies to the rules themselves. Thus, the previous program could have been written:
/12/ { print $0 } ; /21/ { print $0 }
Note: the requirement that rules on the same line must be
separated with a semicolon was not in the original awk
language; it was added for consistency with the treatment of statements
within an action.
Go to the first, previous, next, last section, table of contents.