# gawk

## NAME



           gawk - pattern scanning and processing language
    


## SYNOPSIS



           **gawk**[ POSIX or GNU style options ] **-f** _program-file_ [ **--**] file
           ...
           **gawk**[ POSIX or GNU style options ] [ **--**] _program-text_ file ...
    


## README FIRST



           This manual page is provided as a courtesy.  Please note that the
           One Source Of Truth for _gawk_ is the Texinfo manual, available
           online in several formats at
           _https://www.gnu.org/software/gawk/manual _.  It may also be
           installed in the Info subsystem on your system, and available
           therefore via the **info**(1) command.
    
           In the case of any contradiction between the Texinfo manual and
           this man page, the manual should be considered to be
           authoritative.
    


## DESCRIPTION



           _Gawk_ is the GNU Project's implementation of the AWK programming
           language.  It conforms to the definition of the language in the
           POSIX 1003.1 standard.  This version in turn is based on the
           description in _The AWK Programming Language_ , by Aho, Kernighan,
           and Weinberger.  _Gawk_ provides the additional features found in
           the current version of Brian Kernighan's _awk_ and numerous GNU-
           specific extensions.
    
           The command line consists of options to _gawk_ itself, the AWK
           program text (if not supplied via the **-f** or **--include** options),
           and values to be made available in the **ARGC** and **ARGV** pre-defined
           AWK variables.
    


## PREFACE



           This manual page is intentionally as terse as possible.  Full
           details are provided in _GAWK: Effective AWK Programming_ , and you
           should look there for the full story on any specific feature.
           Where possible, links to the online version of the manual are
           provided.
    


## OPTION FORMAT



           _Gawk_ options may be either traditional POSIX-style one letter
           options, or GNU-style long options.  POSIX options start with a
           single “-”, while long options start with “--”.  Long options are
           provided for both GNU-specific features and for POSIX-mandated
           features.
    
           _Gawk_ -specific options are typically used in long-option form.
           Arguments to long options are either joined with the option by an
           **=** sign, with no intervening spaces, or they may be provided in the
           next command line argument.  Long options may be abbreviated, as
           long as the abbreviation remains unique.
    
           Additionally, every long option has a corresponding short option,
           so that the option's functionality may be used from within **#!**
           executable scripts.
    


## OPTIONS



           _Gawk_ accepts the following options.  Standard options are listed
           first, followed by options for _gawk_ extensions, listed
           alphabetically by short option.
    
           **-f** _program-file_ , **--file** _program-file_
                  Read the AWK program source from the file _program-file_ ,
                  instead of from the first command line argument.  Multiple
                  **-f** options may be used.  Files read with **-f** are treated as
                  if they begin with an implicit **@namespace "awk"** statement.
    
           **-F** _fs_ , **--field-separator** _fs_
                  Use _fs_ for the input field separator (the value of the **FS**
                  predefined variable).
    
           **-v** _var_**=**_val_ , **--assign** _var_**=**_val_
                  Assign the value _val_ to the variable _var_ , before execution
                  of the program begins.  Such variable values are available
                  to the **BEGIN** rule of an AWK program.
    
           **-b** , **--characters-as-bytes**
                  Treat all input data as single-byte characters.  The
                  **--posix** option overrides this one.
    
           **-c** , **--traditional**
                  Run in _compatibility_ mode.  In compatibility mode, _gawk_
                  behaves identically to Brian Kernighan's _awk_ ; none of the
                  GNU-specific extensions are recognized.
    
           **-C** , **--copyright**
                  Print the short version of the GNU copyright information
                  message on the standard output and exit successfully.
    
           **-d**[_file_], **--dump-variables**[**=**_file_]
                  Print a sorted list of global variables, their types and
                  final values to _file_.  The default file is **awkvars.out** in
                  the current directory.
    
           **-D**[_file_], **--debug**[**=**_file_]
                  Enable debugging of AWK programs.  By default, the debugger
                  reads commands interactively from the keyboard (standard
                  input).  The optional _file_ argument specifies a file with a
                  list of commands for the debugger to execute non-
                  interactively.
                  In this mode of execution, _gawk_ loads the AWK source code
                  and then prompts for debugging commands.  _Gawk_ can only
                  debug AWK program source provided with the **-f** and **--include**
                  options.  The debugger is documented in _GAWK: Effective AWK_
                  _Programming_ ; see
                  _https://www.gnu.org/software/gawk/manual/html_node/Debugger.html#Debugger _.
    
           **-e** _program-text_ , **--source** _program-text_
                  Use _program-text_ as AWK program source code.  Each argument
                  supplied via **-e** is treated as if it begins with an implicit
                  **@namespace "awk"** statement.
    
           **-E** _file_ , **--exec** _file_
                  Similar to **-f** , however, this option is the last one
                  processed.  This should be used with **#!** scripts,
                  particularly for CGI applications, to avoid passing in
                  options or source code (!) on the command line from a URL.
                  This option disables command-line variable assignments.
    
           **-g** , **--gen-pot**
                  Scan and parse the AWK program, and generate a GNU **.pot**
                  (Portable Object Template) format file on standard output
                  with entries for all localizable strings in the program.
                  The program itself is not executed.
    
           **-h** , **--help**
                  Print a relatively short summary of the available options
                  on the standard output.  Per the _GNU Coding Standards_ ,
                  these options cause an immediate, successful exit.
    
           **-i** _include-file_ , **--include** _include-file_
                  Load an awk source library.  This searches for the library
                  using the **AWKPATH** environment variable.  If the initial
                  search fails, another attempt will be made after appending
                  the **.awk** suffix.  The file will be loaded only once (i.e.,
                  duplicates are eliminated), and the code does not
                  constitute the main program source.  Files read with
                  **--include** are treated as if they begin with an implicit
                  **@namespace "awk"** statement.
    
           **-I** , **--trace**
                  Print the internal byte code names as they are executed
                  when running the program.  The trace is printed to standard
                  error.  Each “op code” is preceded by a **+** sign in the
                  output.
    
           **-k** , **--csv**
                  Enable CSV special processing.  See **Comma Separated Values** ,
                  below, for more detail.
    
           **-l** _lib_ , **--load** _lib_
                  Load a _gawk_ extension from the shared library _lib_.  This
                  searches for the library using the **AWKLIBPATH** environment
                  variable.  If the initial search fails, another attempt
                  will be made after appending the default shared library
                  suffix for the platform.  The library initialization
                  routine is expected to be named **dl_load()**.
    
           **-L**[_value_], **--lint**[**=**_value_]
                  Provide warnings about constructs that are dubious or non-
                  portable to other AWK implementations.  See
                  _https://www.gnu.org/software/gawk/manual/html_node/Options.html#Options _
                  for the list of possible values for _value_.
    
           **-M** , **--bignum**
                  Force arbitrary precision arithmetic on numbers.  This
                  option has no effect if _gawk_ is not compiled to use the GNU
                  MPFR and GMP libraries.  (In such a case, _gawk_ issues a
                  warning.)
    
                  **NOTE:** This feature is _on parole_.  The primary _gawk_
                  maintainer is no longer supporting it, although there is a
                  member of the development team who is.  If this situation
                  changes, the feature will be removed from _gawk_.
    
           **-n** , **--non-decimal-data**
                  Recognize octal and hexadecimal values in input data.  _Use_
                  _this option with great caution!_
    
           **-N** , **--use-lc-numeric**
                  Force _gawk_ to use the locale's decimal point character when
                  parsing input data.
    
           **-o**[_file_], **--pretty-print**[**=**_file_]
                  Output a pretty printed version of the program to _file_.
                  The default file is **awkprof.out** in the current directory.
                  This option implies **--no-optimize**.
    
           **-O** , **--optimize**
                  Enable _gawk_ 's default optimizations upon the internal
                  representation of the program.  This option is on by
                  default.
    
           **-p**[_prof-file_], **--profile**[**=**_prof-file_]
                  Start a profiling session, and send the profiling data to
                  _prof-file_.  The default is **awkprof.out** in the current
                  directory.  The profile contains execution counts of each
                  statement in the program in the left margin and function
                  call counts for each user-defined function.  _Gawk_ runs more
                  slowly in this mode.  This option implies **--no-optimize**.
    
           **-P** , **--posix**
                  This turns on _compatibility_ mode, and disables a number of
                  common extensions.
    
           **-r** , **--re-interval**
                  Enable the use of _interval expressions_ in regular
                  expression matching.  Interval expressions are enabled by
                  default, but this option remains for backwards
                  compatibility.
    
           **-s** , **--no-optimize**
                  Disable _gawk_ 's default optimizations upon the internal
                  representation of the program.
    
           **-S** , **--sandbox**
                  Run _gawk_ in sandbox mode, disabling the **system()** function,
                  input redirection with **getline** , output redirection with
                  **print** and **printf** , and loading dynamic extensions.  Command
                  execution (through pipelines) is also disabled.
    
           **-t** , **--lint-old**
                  Provide warnings about constructs that are not portable to
                  the original version of UNIX _awk_.
    
           **-V** , **--version**
                  Print version information for this particular copy of _gawk_
                  on the standard output.  This is useful when reporting
                  bugs.  Per the _GNU Coding Standards_ , these options cause an
                  immediate, successful exit.
    
           **--** Signal the end of options.  This is useful to allow further
                  arguments to the AWK program itself to start with a “-”.
    
           In compatibility mode, any other options are flagged as invalid,
           but are otherwise ignored.  In normal operation, as long as
           program text has been supplied, unknown options are passed on to
           the AWK program in the **ARGV** array for processing.
    
           For POSIX compatibility, the **-W** option may be used, followed by
           the name of a long option.
    


## AWK PROGRAM EXECUTION



           An AWK program consists of a sequence of optional directives,
           pattern-action statements, and optional function definitions.
    
                  **@include "**_filename_**"**
                  **@nsinclude "**_filename_**"**
                  **@load "**_filename_**"**
                  **@namespace "**_name_**"**
                  _pattern_   **{**_action statements_ **}**
                  **function** _name_**(**_parameter list_**) {**_statements_ **}**
    
           _Gawk_ first reads the program source from the _program-file_(s) if
           specified, from arguments to **--source** , or from the first non-
           option argument on the command line.  The **-f** and **--source** options
           may be used multiple times on the command line.  _Gawk_ reads the
           program text as if all the _program-file_ s and command line source
           texts had been concatenated together.
    
           In addition, lines beginning with **@include** may be used to include
           other source files into your program.  This is equivalent to using
           the **--include** option.
    
           Lines beginning with **@nsinclude** also include files, but with two
           differences.  First, the namespace in the included file is _not_
           reset to the default of **awk** , and such files may be included
           multiple times.
    
           Lines beginning with **@load** may be used to load extension functions
           into your program.  This is equivalent to using the **--load** option.
    
           The environment variable **AWKPATH** specifies a search path to use
           when finding source files named with the **-f** and **--include** options.
           If this variable does not exist, the default path is
           **".:/usr/local/share/awk"**.  (The actual directory may vary,
           depending upon how _gawk_ was built and installed.)  If a file name
           given to the **-f** option contains a “/” character, no path search is
           performed.
    
           The environment variable **AWKLIBPATH** specifies a search path to use
           when finding source files named with the **--load** option.  If this
           variable does not exist, the default path is
           **"/usr/local/lib/gawk"**.  (The actual directory may vary, depending
           upon how _gawk_ was built and installed.)
    
           _Gawk_ executes AWK programs in the following order.  First, all
           variable assignments specified via the **-v** option are performed.
           Next, _gawk_ compiles the program into an internal form.  Then, _gawk_
           executes the code in the **BEGIN** rule(s) (if any), and then proceeds
           to read each file named in the **ARGV** array (up to **ARGV[ARGC-1]**).
           If there are no files named on the command line, _gawk_ reads the
           standard input.
    
           If a filename on the command line has the form _var_**=**_val_ it is
           treated as a variable assignment.  The variable _var_ will be
           assigned the value _val_.  (This happens after any **BEGIN** rule(s)
           have been run.)
    
           If the value of a particular element of **ARGV** is empty (**""**), _gawk_
           skips over it.
    
           For each input file, if a **BEGINFILE** rule exists, _gawk_ executes the
           associated code before processing the contents of the file.
           Similarly, _gawk_ executes the code associated with **ENDFILE** rules
           after processing the file.
    
           For each record in the input, _gawk_ tests to see if it matches any
           _pattern_ in the AWK program.  For each pattern that the record
           matches, _gawk_ executes the associated _action_.  The patterns are
           tested in the order they occur in the program.
    
           Finally, after all the input is exhausted, _gawk_ executes the code
           in the **END** rule(s) (if any).
    
       **Command Line Directories**
           According to POSIX, files named on the _awk_ command line must be
           text files.  The behavior is “undefined” if they are not.  Most
           versions of _awk_ treat a directory on the command line as a fatal
           error.
    
           For _gawk_ , a directory on the command line produces a warning, but
           is otherwise skipped.  If either of the **--posix** or **--traditional**
           options is given, then _gawk_ reverts to treating directories on the
           command line as a fatal error.
    


## VARIABLES, RECORDS AND FIELDS



           AWK variables are dynamic; they come into existence when they are
           first used.  Their values are either floating-point numbers or
           strings, or both, depending upon how they are used.  Additionally,
           _gawk_ allows variables to have regular-expression type.  AWK also
           has one dimensional arrays; arrays with multiple dimensions may be
           simulated.  However, _gawk_ provides true arrays of arrays.  Several
           pre-defined variables are set as a program runs; these are
           described as needed and summarized below.
    
       **Records**
           Normally, records are separated by newline characters.  You can
           control how records are separated by assigning values to the
           built-in variable **RS**.  See
           _https://www.gnu.org/software/gawk/manual/html_node/Records.html _
           for the details.
    
       **Fields**
           As each input record is read, _gawk_ splits the record into _fields_ ,
           using the value of the **FS** variable as the field separator.
           Additionally, **FIELDWIDTHS** and **FPAT** may be used to control input
           field splitting.  See the details, starting at
           _https://www.gnu.org/software/gawk/manual/html_node/Fields.html _.
    
           Each field in the input record may be referenced by its position:
           **$1** , **$2** , and so on.  **$0** is the whole record, including leading and
           trailing whitespace.
    
           The variable **NF** is set to the total number of fields in the input
           record.
    
           References to non-existent fields (i.e., fields after **$NF**) produce
           the null string.  However, assigning to a non-existent field
           (e.g., **$(NF+2) = 5**) increases the value of **NF** , creates any
           intervening fields with the null string as their values, and
           causes the value of **$0** to be recomputed, with the fields being
           separated by the value of **OFS**.  References to negative numbered
           fields cause a fatal error.  Decrementing **NF** causes the values of
           fields past the new value to be lost, and the value of **$0** to be
           recomputed, with the fields being separated by the value of **OFS**.
    
           Assigning a value to an existing field causes the whole record to
           be rebuilt when **$0** is referenced.  Similarly, assigning a value to
           **$0** causes the record to be resplit, creating new values for the
           fields.
    
       **Comma Separated Values**
           When invoked with either the **-k** or the **--csv** option, _gawk_ does not
           use regular record determination and field splitting as described
           above.  Instead, records are terminated by unquoted newlines, and
           fields are separated by commas.  Double-quotes may be used to
           enclose fields containing commas, newlines, or doubled double-
           quotes.  See
           _https://www.gnu.org/software/gawk/manual/html_node/Comma-Separated-Fields.html _
           for more details.
    
       **Built-in Variables**
           _Gawk_ 's built-in variables are listed below.  This list is
           purposely terse.  For details, see
           _https://www.gnu.org/software/gawk/manual/html_node/Built_002din-Variables _.
    
           **ARGC** The number of command line arguments.
    
           **ARGIND** The index in **ARGV** of the current file being processed.
    
           **ARGV** Array of command line arguments.  The array is indexed from
                  0 to **ARGC** - 1.
    
           **BINMODE**
                  On non-POSIX systems, specifies use of “binary” mode for
                  all file I/O.  See
                  _https://www.gnu.org/software/gawk/manual/html_node/PC-Using.html _
                  for the details.
    
           **CONVFMT**
                  The conversion format for numbers, **"%.6g"** , by default.
    
           **ENVIRON**
                  An array containing the values of the current environment.
                  The array is indexed by the environment variables, each
                  element being the value of that variable.
    
           **ERRNO** If a system error occurs either doing a redirection for
                  **getline** , during a read for **getline** , or during a **close()** ,
                  then **ERRNO** is set to a string describing the error.  The
                  value is subject to translation in non-English locales.
    
           **FIELDWIDTHS**
                  A whitespace-separated list of field widths.  When set,
                  _gawk_ parses the input into fields of fixed width, instead
                  of using the value of the **FS** variable as the field
                  separator.  Each field width may optionally be preceded by
                  a colon-separated value specifying the number of characters
                  to skip before the field starts.
    
           **FILENAME**
                  The name of the current input file.  If no files are
                  specified on the command line, the value of **FILENAME** is
                  “-”.  However, **FILENAME** is undefined inside the **BEGIN** rule
                  (unless set by **getline**).
    
           **FNR** The input record number in the current input file.
    
           **FPAT** A regular expression describing the contents of the fields
                  in a record.  When set, _gawk_ parses the input into fields,
                  where the fields match the regular expression, instead of
                  using the value of **FS** as the field separator.
    
           **FS** The input field separator, a space by default.  See
                  _https://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html _
                  for the details.
    
           **FUNCTAB**
                  An array whose indices and corresponding values are the
                  names of all the user-defined or extension functions in the
                  program.  **NOTE** : You may not use the **delete** statement with
                  the **FUNCTAB** array.
    
           **IGNORECASE**
                  Controls the case-sensitivity of all regular expression and
                  string operations.  See
                  _https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html _
                  for details.
    
           **LINT** Provides dynamic control of the **--lint** option from within
                  an AWK program.
    
           **NF** The number of fields in the current input record.
    
           **NR** The total number of input records seen so far.
    
           **OFMT** The output format for numbers, **"%.6g"** , by default.
    
           **OFS** The output field separator, a space by default.
    
           **ORS** The output record separator, by default a newline.
    
           **PREC** The working precision of arbitrary precision floating-point
                  numbers, 53 by default.
    
           **PROCINFO**
                  The elements of this array provide access to information
                  about the running AWK program.  See
                  _https://www.gnu.org/software/gawk/manual/html_node/Auto_002dset _
                  for the details.
    
           **ROUNDMODE**
                  The rounding mode to use for arbitrary precision arithmetic
                  on numbers, by default **"N"**(IEEE-754 roundTiesToEven mode).
                  See
                  _https://www.gnu.org/software/gawk/manual/html_node/Setting-the-rounding-mode _
                  for the details.
    
           **RS** The input record separator, by default a newline.
    
           **RT** The record terminator.  _Gawk_ sets **RT** to the input text that
                  matched the character or regular expression specified by
                  **RS**.
    
           **RSTART** The index of the first character matched by **match()** ; 0 if
                  no match.
    
           **RLENGTH**
                  The length of the string matched by **match()** ; -1 if no
                  match.
    
           **SUBSEP** The string used to separate multiple subscripts in array
                  elements, by default **"\034"**.
    
           **SYMTAB** An array whose indices are the names of all currently
                  defined global variables and arrays in the program.  You
                  may not use the **delete** statement with the **SYMTAB** array, nor
                  assign to elements with an index that is not a variable
                  name.
    
           **TEXTDOMAIN**
                  The text domain of the AWK program; used to find the
                  localized translations for the program's strings.
    
       **Arrays**
           Arrays are subscripted with an expression between square brackets
           (**[** and **]**).  If the expression is an expression list (_expr_ , _expr_
           ...)  then the array subscript is a string consisting of the
           concatenation of the (string) value of each expression, separated
           by the value of the **SUBSEP** variable.  This facility is used to
           simulate multiply dimensioned arrays.  For example:
    
                  **i = "A"; j = "B"; k = "C"**
                  **x[i, j, k] = "hello, world\n"**
    
           assigns the string **"hello, world\n"** to the element of the array **x**
           which is indexed by the string **"A\034B\034C"**.  All arrays in AWK
           are associative, i.e., indexed by string values.
    
           The special operator **in** may be used to test if an array has an
           index consisting of a particular value:
    
                  **if (val in array)**
                       **print array[val]**
    
           If the array has multiple subscripts, use **(i, j) in array**.
    
           The **in** construct may also be used in a **for** loop to iterate over
           all the elements of an array.  However, the **(i, j) in array**
           construct only works in tests, not in **for** loops.
    
           An element may be deleted from an array using the **delete**
           statement.  The **delete** statement may also be used to delete the
           entire contents of an array, just by specifying the array name
           without a subscript.
    
           _gawk_ supports true multidimensional arrays.  It does not require
           that such arrays be “rectangular” as in C or C++.  See
           _https://www.gnu.org/software/gawk/manual/html_node/Arrays _ for
           details.
    
       **Namespaces**
           _Gawk_ provides a simple _namespace_ facility to help work around the
           fact that all variables in AWK are global.
    
           A _qualified name_ consists of a two simple identifiers joined by a
           double colon (**::**).  The left-hand identifier represents the
           namespace and the right-hand identifier is the variable within it.
           All simple (non-qualified) names are considered to be in the
           “current” namespace; the default namespace is **awk**.  However,
           simple identifiers consisting solely of uppercase letters are
           forced into the **awk** namespace, even if the current namespace is
           different.
    
           You change the current namespace with an **@namespace "**_name_**"**
           directive.
    
           The standard predefined builtin function names may not be used as
           namespace names.  The names of additional functions provided by
           _gawk_ may be used as namespace names or as simple identifiers in
           other namespaces.  For more details, see
           _https://www.gnu.org/software/gawk/manual/html_node/Namespaces.html#Namespaces _.
    
       **Variable Typing And Conversion**
           Variables and fields may be (floating point) numbers, or strings,
           or both.  They may also be regular expressions.  How the value of
           a variable is interpreted depends upon its context.  If used in a
           numeric expression, it will be treated as a number; if used as a
           string it will be treated as a string.
    
           To force a variable to be treated as a number, add zero to it; to
           force it to be treated as a string, concatenate it with the null
           string.
    
           Uninitialized variables have the numeric value zero and the string
           value "" (the null, or empty, string).
    
           When a string must be converted to a number, the conversion is
           accomplished using strtod(3).  A number is converted to a string
           by using the value of **CONVFMT** as a format string for sprintf(3),
           with the numeric value of the variable as the argument.  However,
           even though all numbers in AWK are floating-point, integral values
           are _always_ converted as integers.
    
           _Gawk_ performs comparisons as follows: If two variables are
           numeric, they are compared numerically.  If one value is numeric
           and the other has a string value that is a “numeric string,” then
           comparisons are also done numerically.  Otherwise, the numeric
           value is converted to a string and a string comparison is
           performed.  Two strings are compared, of course, as strings.
    
           Note that string constants, such as **"57"** , are _not_ numeric strings,
           they are string constants.  The idea of “numeric string” only
           applies to fields, **getline** input, **FILENAME** , **ARGV** elements, **ENVIRON**
           elements and the elements of an array created by **split()** or
           **patsplit()** that are numeric strings.  The basic idea is that _user_
           _input_ , and only user input, that looks numeric, should be treated
           that way.
    
       **Octal and Hexadecimal Constants**
           You may use C-style octal and hexadecimal constants in your AWK
           program source code.  For example, the octal value **011** is equal to
           decimal **9** , and the hexadecimal value **0x11** is equal to decimal 17.
    
       **String Constants**
           String constants in AWK are sequences of characters enclosed
           between double quotes (like **"value"**).  Within strings, certain
           _escape sequences_ are recognized, as in C.  See
           _https://www.gnu.org/software/gawk/manual/html_node/Escape-Sequences _
           for the details.
    
       **Regexp Constants**
           A regular expression constant is a sequence of characters enclosed
           between forward slashes (like **/value/**).
    
           The escape sequences described in the manual may also be used
           inside constant regular expressions (e.g., **/[ \t\f\n\r\v]/** matches
           whitespace characters).
    
           _Gawk_ provides _strongly typed_ regular expression constants.  These
           are written with a leading **@** symbol (like so: **@/value/**).  Such
           constants may be assigned to scalars (variables, array elements)
           and passed to user-defined functions.  Variables that have been so
           assigned have regular expression type.
    


## PATTERNS AND ACTIONS



           AWK is a line-oriented language.  The pattern comes first, and
           then the action.  Action statements are enclosed in **{** and **}**.
           Either the pattern may be missing, or the action may be missing,
           but, of course, not both.  If the pattern is missing, the action
           executes for every single record of input.  A missing action is
           equivalent to
    
                  **{ print }**
    
           which prints the entire record.
    
           Comments begin with the **#** character, and continue until the end of
           the line.  Empty lines may be used to separate statements.
           Normally, a statement ends with a newline, however, this is not
           the case for lines ending in a comma, **{** , **?** , **:** , **& &**, or **||**.  Lines
           ending in **do** or **else** also have their statements automatically
           continued on the following line.  In other cases, a line can be
           continued by ending it with a “\”, in which case the newline is
           ignored.  However, a “\” after a **#** is not special.
    
           Multiple statements may be put on one line by separating them with
           a “;”.  This applies to both the statements within the action part
           of a pattern-action pair (the usual case), and to the pattern-
           action statements themselves.
    
       **Patterns**
           AWK patterns may be one of the following:
    
                  **BEGIN**
                  **END**
                  **BEGINFILE**
                  **ENDFILE**
                  **/**_regular expression_**/**
                  _relational expression_
                  _pattern_ **& & **_pattern_
                  _pattern_ **||**_pattern_
                  _pattern_ **?**_pattern_ **:**_pattern_
                  **(**_pattern_**)**
                  **!**_pattern_
                  _pattern1_**,**_pattern2_
    
           **BEGIN** and **END** are two special kinds of patterns which are not
           tested against the input.  The action parts of all **BEGIN** patterns
           are merged as if all the statements had been written in a single
           **BEGIN** rule.  They are executed before any of the input is read.
           Similarly, all the **END** rules are merged, and executed when all the
           input is exhausted (or when an **exit** statement is executed).  **BEGIN**
           and **END** patterns cannot be combined with other patterns in pattern
           expressions.  **BEGIN** and **END** patterns cannot have missing action
           parts.
    
           **BEGINFILE** and **ENDFILE** are additional special patterns whose
           actions are executed before reading the first record of each
           command-line input file and after reading the last record of each
           file.  Inside the **BEGINFILE** rule, the value of **ERRNO** is the empty
           string if the file was opened successfully.  Otherwise, there is
           some problem with the file and the code should use **nextfile** to
           skip it.  If that is not done, _gawk_ produces its usual fatal error
           for files that cannot be opened.
    
           For **/**_regular expression_**/** patterns, the associated statement is
           executed for each input record that matches the regular
           expression.  Regular expressions are essentially the same as those
           in **egrep**(1).  See
           _https://www.gnu.org/software/gawk/manual/html_node/Regexp.html _ for
           the details on regular expressions.
    
           A _relational expression_ may use any of the operators defined below
           in the section on actions.  These generally test whether certain
           fields match certain regular expressions.
    
           The **& &**, **||** , and **!** operators are logical AND, logical OR, and
           logical NOT, respectively, as in C.  They do short-circuit
           evaluation, also as in C, and are used for combining more
           primitive pattern expressions.  As in most languages, parentheses
           may be used to change the order of evaluation.
    
           The **?:** operator is like the same operator in C.  If the first
           pattern is true then the pattern used for testing is the second
           pattern, otherwise it is the third.  Only one of the second and
           third patterns is evaluated.
    
           The _pattern1_**,**_pattern2_ form of an expression is called a _range_
           _pattern_.  It matches all input records starting with a record that
           matches _pattern1_ , and continuing until a record that matches
           _pattern2_ , inclusive.  It does not combine with any other sort of
           pattern expression.
    
       **Actions**
           Action statements are enclosed in braces, **{** and **}**.  Action
           statements consist of the usual assignment, conditional, and
           looping statements found in most languages.  The operators,
           control statements, and input/output statements available are
           patterned after those in C.
    
       **Operators**
           The operators in AWK, in order of decreasing precedence, are:
    
           **(**...**)** Grouping
    
           **$** Field reference.
    
           **++ --** Increment and decrement, both prefix and postfix.
    
           **^** Exponentiation.
    
           **+ - !** Unary plus, unary minus, and logical negation.
    
           *** / %** Multiplication, division, and modulus.
    
           **+ -** Addition and subtraction.
    
           _space_  String concatenation.
    
           **|   | & **Piped I/O for **getline** , **print** , and **printf**.
    
           **< > <= >= == !=**
                  The regular relational operators.
    
           **~ !~** Regular expression match, negated match.
    
           **in** Array membership.
    
           **& &     **Logical AND.
    
           **||** Logical OR.
    
           **?:** The C conditional expression.  This has the form _expr1_ **?**
                  _expr2_ **:**_expr3_.  If _expr1_ is true, the value of the
                  expression is _expr2_ , otherwise it is _expr3_.  Only one of
                  _expr2_ and _expr3_ is evaluated.
    
           **= += -= *= /= %= ^=**
                  Assignment.  Both absolute assignment **(**_var_ **=**_value_**)** and
                  operator-assignment (the other forms) are supported.
    
       **Control Statements**
           The control statements are as follows:
    
                  **if (**_condition_**)**_statement_ [ **else** _statement_ ]
                  **while (**_condition_**)**_statement_
                  **do** _statement_ **while (**_condition_**)**
                  **for (**_expr1_**;**_expr2_**;**_expr3_**)**_statement_
                  **for (**_var_ **in** _array_**)**_statement_
                  **break**
                  **continue**
                  **delete** _array_**[**_index_**]**
                  **delete** _array_
                  **exit**[ _expression_ ]
                  **{**_statements_ **}**
                  **switch (**_expression_**) {**
                  **case** _value_**|**_regex_ **:**_statement_
                  _..._
                  [ **default:**_statement_ ]
                  **}**
    
       **I/O Statements**
           The input/output statements are as follows:
    
           **close(**_file_ [**,**_how_]**)**
                  Close an open file, pipe or coprocess.  The optional _how_
                  should only be used when closing one end of a two-way pipe
                  to a coprocess.  It must be a string value, either **"to"** or
                  **"from"**.
    
           **getline**
                  Set **$0** from the next input record; set **NF** , **NR** , **FNR** , **RT**.
    
           **getline <**_file_
                  Set **$0** from the next record of _file_ ; set **NF** , **RT**.
    
           **getline** _var_
                  Set _var_ from the next input record; set **NR** , **FNR** , **RT**.
    
           **getline** _var_ **<**_file_
                  Set _var_ from the next record of _file_ ; set **RT**.
    
           _command_ **| getline**[_var_]
                  Run _command_ , piping the output either into **$0** or _var_ , as
                  above, and **RT**.
    
           _command_ **| & getline **[_var_]
                  Run _command_ as a coprocess piping the output either into **$0**
                  or _var_ , as above, and **RT**.  (The _command_ can also be a
                  socket.  See the subsection **Special File Names** , below.)
    
           **fflush(**[_file_]**)**
                  Flush any buffers associated with the open output file or
                  pipe _file_.  If _file_ is missing or if it is the null string,
                  then flush all open output files and pipes.
    
           **next** Stop processing the current input record.  Read the next
                  input record and start processing over with the first
                  pattern in the AWK program.  Upon reaching the end of the
                  input data, execute any **END** rule(s).
    
           **nextfile**
                  Stop processing the current input file.  The next input
                  record read comes from the next input file.  Update
                  **FILENAME** and **ARGIND** , reset **FNR** to 1, and start processing
                  over with the first pattern in the AWK program.  Upon
                  reaching the end of the input data, execute any **ENDFILE** and
                  **END** rule(s).
    
           **print** Print the current record.  The output record is terminated
                  with the value of **ORS**.
    
           **print** _expr-list_
                  Print expressions.  Each expression is separated by the
                  value of **OFS**.  The output record is terminated with the
                  value of **ORS**.
    
           **print** _expr-list_ **>**_file_
                  Print expressions on _file_.  Each expression is separated by
                  the value of **OFS**.  The output record is terminated with the
                  value of **ORS**.
    
           **printf** _fmt, expr-list_
                  Format and print.
    
           **printf** _fmt, expr-list_ **>**_file_
                  Format and print on _file_.
    
           **system(**_cmd-line_**)**
                  Execute the command _cmd-line_ , and return the exit status.
                  (This may not be available on non-POSIX systems.)  See
                  _https://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html#I_002fO-Functions _
                  for the full details on the exit status.
    
           Additional output redirections are allowed for **print** and **printf**.
    
           **print ... >> **_file_
                  Append output to the _file_.
    
           **print ... |**_command_
                  Write on a pipe.
    
           **print ... | & **_command_
                  Send data to a coprocess or socket.  (See also the
                  subsection **Special File Names** , below.)
    
           The **getline** function returns 1 on success, zero on end of file,
           and -1 on an error.  If the errno(3) value indicates that the I/O
           operation may be retried, and **PROCINFO["**_input_**", "RETRY"]** is set,
           then -2 is returned instead of -1, and further calls to **getline**
           may be attempted.  Upon an error, **ERRNO** is set to a string
           describing the problem.
    
           **NOTE** : Failure in opening a two-way socket results in a non-fatal
           error being returned to the calling function.  If using a pipe,
           coprocess, or socket to **getline** , or from **print** or **printf** within a
           loop, you _must_ use **close()** to create new instances of the command
           or socket.  AWK does not automatically close pipes, sockets, or
           coprocesses when they return EOF.
    
           The AWK versions of the **printf** statement and **sprintf()** function
           are similar to those of C.  For details, see
           _https://www.gnu.org/software/gawk/manual/html_node/Printf.html _.
    
       **Special File Names**
           When doing I/O redirection from either **print** or **printf** into a
           file, or via **getline** from a file, _gawk_ recognizes certain special
           filenames internally.  These filenames allow access to open file
           descriptors inherited from _gawk_ 's parent process (usually the
           shell).  These file names may also be used on the command line to
           name data files.  The filenames are:
    
           **-** The standard input.
    
           **/dev/stdin**
                  The standard input.
    
           **/dev/stdout**
                  The standard output.
    
           **/dev/stderr**
                  The standard error output.
    
           **/dev/fd/**_n_
                  The file associated with the open file descriptor _n_.
    
           The following special filenames may be used with the **| & **coprocess
           operator for creating TCP/IP network connections:
    
           **/inet/tcp/**_lport_**/**_rhost_**/**_rport_
           **/inet4/tcp/**_lport_**/**_rhost_**/**_rport_
           **/inet6/tcp/**_lport_**/**_rhost_**/**_rport_
                  Files for a TCP/IP connection on local port _lport_ to remote
                  host _rhost_ on remote port _rport_.  Use a port of **0** to have
                  the system pick a port.  Use **/inet4** to force an IPv4
                  connection, and **/inet6** to force an IPv6 connection.  Plain
                  **/inet** uses the system default (most likely IPv4).  Usable
                  only with the **| & **two-way I/O operator.
    
           **/inet/udp/**_lport_**/**_rhost_**/**_rport_
           **/inet4/udp/**_lport_**/**_rhost_**/**_rport_
           **/inet6/udp/**_lport_**/**_rhost_**/**_rport_
                  Similar, but use UDP/IP instead of TCP/IP.
    
       **Numeric Functions**
           AWK has the following built-in arithmetic functions:
    
           **atan2(**_y_**,**_x_**)**
                  Return the arctangent of _y/x_ in radians.
    
           **cos(**_expr_**)**
                  Return the cosine of _expr_ , which is in radians.
    
           **exp(**_expr_**)**
                  The exponential function.
    
           **int(**_expr_**)**
                  Truncate to integer.
    
           **log(**_expr_**)**
                  The natural logarithm function.
    
           **rand()** Return a random number _N_ , between zero and one, such that 0
                  ≤ _N_ < 1.
    
           **sin(**_expr_**)**
                  Return the sine of _expr_ , which is in radians.
    
           **sqrt(**_expr_**)**
                  Return the square root of _expr_.
    
           **srand(**[_expr_]**)**
                  Use _expr_ as the new seed for the random number generator.
                  If no _expr_ is provided, use the time of day.  Return the
                  previous seed for the random number generator.
    
       **String Functions**
           _Gawk_ has the following built-in string functions; details are
           provided in
           _https://www.gnu.org/software/gawk/manual/html_node/String-Functions _.
    
           **asort(**_s_ [**,**_d_ [**,**_how_] ]**)**
                  Return the number of elements in the source array _s_.  Sort
                  the contents of _s_ using _gawk_ 's normal rules for comparing
                  values, and replace the indices of the sorted values _s_ with
                  sequential integers starting with 1.  If the optional
                  destination array _d_ is specified, first duplicate _s_ into _d_ ,
                  and then sort _d_ , leaving the indices of the source array _s_
                  unchanged.  The optional string _how_ controls the direction
                  and the comparison mode.  Valid values for _how_ are
                  described in
                  _https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions _.
                  _s_ and _d_ are allowed to be the same array; this only makes
                  sense when supplying the third argument as well.
    
           **asorti(**_s_ [**,**_d_ [**,**_how_] ]**)**
                  Return the number of elements in the source array _s_.  The
                  behavior is the same as that of **asort()** , except that the
                  array _indices_ are used for sorting, not the array values.
                  When done, the array is indexed numerically, and the values
                  are those of the original indices.  The original values are
                  lost; thus provide a second array if you wish to preserve
                  the original.  The purpose of the optional string _how_ is
                  the same as for **asort()**.  Here too, _s_ and _d_ are allowed to
                  be the same array; this only makes sense when supplying the
                  third argument as well.
    
           **gensub(**_r_**,**_s_**,**_h_ [**,**_t_]**)**
                  Search the target string _t_ for matches of the regular
                  expression _r_.  If _h_ is a string beginning with **g** or **G** , then
                  replace all matches of _r_ with _s_.  Otherwise, _h_ is a number
                  indicating which match of _r_ to replace.  If _t_ is not
                  supplied, use **$0** instead.  Within the replacement text _s_ ,
                  the sequence **\**_n_ , where _n_ is a digit from 1 to 9, may be
                  used to indicate just the text that matched the _n_ 'th
                  parenthesized subexpression.  The sequence **\0** represents
                  the entire matched text, as does the character **&**.  Unlike
                  **sub()** and **gsub()** , the modified string is returned as the
                  result of the function, and the original target string is
                  _not_ changed.
    
           **gsub(**_r_**,**_s_ [**,**_t_]**)**
                  For each substring matching the regular expression _r_ in the
                  string _t_ , substitute the string _s_ , and return the number of
                  substitutions.  If _t_ is not supplied, use **$0**.  An **& **in the
                  replacement text is replaced with the text that was
                  actually matched.  Use **\ & **to get a literal **&**.  (This must
                  be typed as **"\\ &"**; see
                  _https://www.gnu.org/software/gawk/manual/html_node/Gory-Details.html#Gory-Details _
                  for a fuller discussion of the rules for ampersands and
                  backslashes in the replacement text of **sub()** , **gsub()** , and
                  **gensub()**.)
    
           **index(**_s_**,**_t_**)**
                  Return the index of the string _t_ in the string _s_ , or zero
                  if _t_ is not present.  (This implies that character indices
                  start at one.)
    
           **length(**[_s_]**)**
                  Return the length of the string _s_ , or the length of **$0** if _s_
                  is not supplied.  With an array argument, **length()** returns
                  the number of elements in the array.
    
           **match(**_s_**,**_r_ [**,**_a_]**)**
                  Return the position in _s_ where the regular expression _r_
                  occurs, or zero if _r_ is not present, and set the values of
                  **RSTART** and **RLENGTH**.  Note that the argument order is the
                  same as for the **~** operator: _str_ **~**_re_.  See
                  _https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions _
                  for a description of how the array _a_ is filled if it is
                  provided.
    
           **patsplit(**_s_**,**_a_ [**,**_r_ [**,**_seps_] ]**)**
                  Split the string _s_ into the array _a_ and the separators
                  array _seps_ on the regular expression _r_ , and return the
                  number of fields.  Element values are the portions of _s_
                  that matched _r_.  The value of **seps[**_i_**]** is the possibly null
                  separator that appeared after **a[**_i_**]**.  The value of **seps[0]**
                  is the possibly null leading separator.  If _r_ is omitted,
                  **FPAT** is used instead.  The arrays _a_ and _seps_ are cleared
                  first.  Splitting behaves identically to field splitting
                  with **FPAT**.
    
           **split(**_s_**,**_a_ [**,**_r_ [**,**_seps_] ]**)**
                  Split the string _s_ into the array _a_ and the separators
                  array _seps_ on the regular expression _r_ , and return the
                  number of fields.  If _r_ is omitted, **FS** is used instead.
                  The arrays _a_ and _seps_ are cleared first.  **seps[**_i_**]** is the
                  field separator matched by _r_ between **a[**_i_**]** and **a[**_i_**+1]**.
                  Splitting behaves identically to field splitting.
    
           **sprintf(**_fmt_**,**_expr-list_**)**
                  Print _expr-list_ according to _fmt_ , and return the resulting
                  string.
    
           **strtonum(**_str_**)**
                  Examine _str_ , and return its numeric value.  If _str_ begins
                  with a leading **0** , treat it as an octal number.  If _str_
                  begins with a leading **0x** or **0X** , treat it as a hexadecimal
                  number.  Otherwise, assume it is a decimal number.
    
           **sub(**_r_**,**_s_ [**,**_t_]**)**
                  Just like **gsub()** , but replace only the first matching
                  substring.  Return either zero or one.
    
           **substr(**_s_**,**_i_ [**,**_n_]**)**
                  Return the at most _n_ -character substring of _s_ starting at
                  _i_.  If _n_ is omitted, use the rest of _s_.
    
           **tolower(**_str_**)**
                  Return a copy of the string _str_ , with all the uppercase
                  characters in _str_ translated to their corresponding
                  lowercase counterparts.  Non-alphabetic characters are left
                  unchanged.
    
           **toupper(**_str_**)**
                  Return a copy of the string _str_ , with all the lowercase
                  characters in _str_ translated to their corresponding
                  uppercase counterparts.  Non-alphabetic characters are left
                  unchanged.
    
           _Gawk_ is multibyte aware.  This means that **index()** , **length()** ,
           **substr()** and **match()** all work in terms of characters, not bytes.
    
       **Time Functions**
           _Gawk_ provides the following functions for obtaining time stamps
           and formatting them.  Details are provided in
           _https://www.gnu.org/software/gawk/manual/html_node/Time-Functions _.
    
           **mktime(**_datespec_ [**,**_utc-flag_]**)**
                  Turn _datespec_ into a time stamp of the same form as
                  returned by **systime()** , and return the result.  If _utc-flag_
                  is present and is non-zero or non-null, the time is assumed
                  to be in the UTC time zone; otherwise, the time is assumed
                  to be in the local time zone.  If _datespec_ does not contain
                  enough elements or if the resulting time is out of range,
                  **mktime()** returns -1.  See
                  _https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html#Time-Functions _
                  for the details of _datespec_.
    
           **strftime(**[_format_ [**,**_timestamp_[**,**_utc-flag_]]]**)**
                  Format _timestamp_ according to the specification in _format_.
                  If _utc-flag_ is present and is non-zero or non-null, the
                  result is in UTC, otherwise the result is in local time.
                  The _timestamp_ should be of the same form as returned by
                  **systime()**.  If _timestamp_ is missing, the current time of
                  day is used.  If _format_ is missing, a default format
                  equivalent to the output of date(1) is used.  The default
                  format is available in **PROCINFO["strftime"]**.  See the
                  specification for the **strftime()** function in ISO C for the
                  format conversions that are guaranteed to be available.
    
           **systime()**
                  Return the current time of day as the number of seconds
                  since the Epoch (1970-01-01 00:00:00 UTC on POSIX systems).
    
       **Bit Manipulations Functions**
           _Gawk_ supplies the following bit manipulation functions.  They work
           by converting double-precision floating point values to **uintmax_t**
           integers, doing the operation, and then converting the result back
           to floating point.  Passing negative operands to any of these
           functions causes a fatal error.
    
           The functions are:
    
           **and(**_v1_**,**_v2_ [, ...]**)**
                  Return the bitwise AND of the values provided in the
                  argument list.  There must be at least two.
    
           **compl(**_val_**)**
                  Return the bitwise complement of _val_.
    
           **lshift(**_val_**,**_count_**)**
                  Return the value of _val_ , shifted left by _count_ bits.
    
           **or(**_v1_**,**_v2_ [, ...]**)**
                  Return the bitwise OR of the values provided in the
                  argument list.  There must be at least two.
    
           **rshift(**_val_**,**_count_**)**
                  Return the value of _val_ , shifted right by _count_ bits.
    
           **xor(**_v1_**,**_v2_ [, ...]**)**
                  Return the bitwise XOR of the values provided in the
                  argument list.  There must be at least two.
    
       **Type Functions**
           The following functions provide type related information about
           their arguments.
    
           **isarray(**_x_**)**
                  Return true if _x_ is an array, false otherwise.
    
           **typeof(**_x_**)**
                  Return a string indicating the type of _x_.  The string will
                  be one of **"array"** , **"number"** , **"regexp"** , **"string"** , **"strnum"** ,
                  **"unassigned"** , or **"undefined"**.
    
       **Internationalization Functions**
           The following functions may be used from within your AWK program
           for translating strings at run-time.  For full details, see
           _https://www.gnu.org/software/gawk/manual/html_node/I18N-Functions.html#I18N-Functions _.
    
           **bindtextdomain(**_directory_ [**,**_domain_]**)**
                  Specify the directory where _gawk_ looks for the **.gmo** files,
                  in case they will not or cannot be placed in the “standard”
                  locations.  It returns the directory where _domain_ is
                  “bound.”
                  The default _domain_ is the value of **TEXTDOMAIN**.  If
                  _directory_ is the null string (**""**), then **bindtextdomain()**
                  returns the current binding for the given _domain_.
    
           **dcgettext(**_string_ [**,**_domain_ [**,**_category_]]**)**
                  Return the translation of _string_ in text domain _domain_ for
                  locale category _category_.  The default value for _domain_ is
                  the current value of **TEXTDOMAIN**.  The default value for
                  _category_ is **"LC_MESSAGES"**.
    
           **dcngettext(**_string1_**,**_string2_**,**_number_ [**,**_domain_ [**,**_category_]]**)**
                  Return the plural form used for _number_ of the translation
                  of _string1_ and _string2_ in text domain _domain_ for locale
                  category _category_.  The default value for _domain_ is the
                  current value of **TEXTDOMAIN**.  The default value for
                  _category_ is **"LC_MESSAGES"**.
    
       **Boolean Valued Functions**
           You can create special Boolean-typed values; see the manual for
           how they work and why they exist.
    
           **mkbool(**_expression_**)**
                  Based on the boolean value of _expression_ return either a
                  true value or a false value.  True values have numeric
                  value one.  False values have numeric value zero.
    


## USER-DEFINED FUNCTIONS



           Functions in AWK are defined as follows:
    
                  **function** _name_**(**_parameter list_**) {**_statements_ **}**
    
           Functions execute when they are called from within expressions in
           either patterns or actions.  Actual parameters supplied in the
           function call are used to instantiate the formal parameters
           declared in the function.  Arrays are passed by reference, other
           variables are passed by value.
    
           Local variables are declared as extra parameters in the parameter
           list.  The convention is to separate local variables from real
           parameters by extra spaces in the parameter list.  For example:
    
                  **function  f(p, q,     a, b)   # a and b are local**
                  **{**
                       **...**
                  **}**
    
                  **/abc/     { ... ; f(1, 2) ; ... }**
    
           The left parenthesis in a function call is required to immediately
           follow the function name, without any intervening whitespace.
           This restriction does not apply to the built-in functions listed
           above.
    
           Functions may call each other and may be recursive.  Function
           parameters used as local variables are initialized to the null
           string and the number zero upon function invocation.
    
           Use **return** _expr_ to return a value from a function.  The return
           value is undefined if no value is provided, or if the function
           returns by “falling off” the end.
    
           Functions may be called indirectly.  To do this, assign the name
           of the function to be called, as a string, to a variable.  Then
           use the variable as if it were the name of a function, prefixed
           with an **@** sign, like so:
                  **function myfunc()**
                  **{**
                       **print "myfunc called"**
                       **...**
                  **}**
    
                  **{    ...**
                       **the_func = "myfunc"**
                       **@the_func()    # call through the_func to myfunc**
                       **...**
                  **}**
    
           If **--lint** has been provided, _gawk_ warns about calls to undefined
           functions at parse time, instead of at run time.  Calling an
           undefined function at run time is a fatal error.
    


## DYNAMICALLY LOADING NEW FUNCTIONS



           You can dynamically add new functions written in C or C++ to the
           running _gawk_ interpreter with the **@load** statement.  The full
           details are beyond the scope of this manual page; see
           _https://www.gnu.org/software/gawk/manual/html_node/Dynamic-Extensions.html#Dynamic-Extensions _.
    


## SIGNALS



           The _gawk_ profiler accepts two signals.  **SIGUSR1** causes it to dump
           a profile and function call stack to the profile file, which is
           either **awkprof.out** , or whatever file was named with the **--profile**
           option.  It then continues to run.  **SIGHUP** causes _gawk_ to dump the
           profile and function call stack and then exit.
    


## INTERNATIONALIZATION



           String constants are sequences of characters enclosed in double
           quotes.  In non-English speaking environments, it is possible to
           mark strings in the AWK program as requiring translation to the
           local natural language.  Such strings are marked in the AWK
           program with a leading underscore (“_”).  For example,
    
                  **gawk 'BEGIN { print "hello, world" }'**
    
           always prints **hello, world**.  But,
    
                  **gawk 'BEGIN { print _"hello, world" }'**
    
           might print **bonjour, monde** in France.  See
           _https://www.gnu.org/software/gawk/manual/html_node/Internationalization.html#Internationalization _
           for the steps involved in producing and running a localizable AWK
           program.
    


## GNU EXTENSIONS



           _Gawk_ has a too-large number of extensions to POSIX _awk_.  They are
           described in
           _https://www.gnu.org/software/gawk/manual/html_node/POSIX_002fGNU.html _.
           All the extensions can be disabled by invoking _gawk_ with the
           **--traditional** or **--posix** options.
    


## ENVIRONMENT VARIABLES



           The **AWKPATH** environment variable can be used to provide a list of
           directories that _gawk_ searches when looking for files named via
           the **-f** , **--file** , **-i** and **--include** options, and the **@include** and
           **@nsinclude** directives.  If the initial search fails, the path is
           searched again after appending **.awk** to the filename.
    
           The **AWKLIBPATH** environment variable can be used to provide a list
           of directories that _gawk_ searches when looking for files named via
           the **-l** and **--load** options.
    
           The **GAWK_PERSIST_FILE** environment variable, if present, specifies
           a file to use as the backing store for persistent memory.  See
           _GAWK: Effective AWK Programming_ for the details.
    
           The **GAWK_READ_TIMEOUT** environment variable can be used to specify
           a timeout in milliseconds for reading input from a terminal, pipe
           or two-way communication including sockets.
    
           For connection to a remote host via socket, **GAWK_SOCK_RETRIES**
           controls the number of retries, and **GAWK_MSEC_SLEEP** the interval
           between retries.  The interval is in milliseconds.  On systems
           that do not support usleep(3), the value is rounded up to an
           integral number of seconds.
    
           If **POSIXLY_CORRECT** exists in the environment, then _gawk_ behaves
           exactly as if **--posix** had been specified on the command line.  If
           **--lint** has been specified, _gawk_ issues a warning message to this
           effect.
    


## EXIT STATUS



           If the **exit** statement is used with a value, then _gawk_ exits with
           the numeric value given to it.
    
           Otherwise, if there were no problems during execution, _gawk_ exits
           with the value of the C constant **EXIT_SUCCESS**.  This is usually
           zero.
    
           If an error occurs, _gawk_ exits with the value of the C constant
           **EXIT_FAILURE**.  This is usually one.
    
           If _gawk_ exits because of a fatal error, the exit status is 2.  On
           non-POSIX systems, this value may be mapped to **EXIT_FAILURE**.
    


## VERSION INFORMATION



           This man page documents _gawk_ , version 5.3.
    


## BUG REPORTS AND QUESTIONS



           If you find a bug in _gawk_ , please use the **gawkbug**(1) program to
           report it.
    
           Full instructions for reporting a bug are provided in
           _https://www.gnu.org/software/gawk/manual/html_node/Bugs.html _.
           _Please_ carefully read and follow the instructions given there.
           This will make bug reporting and resolution much easier for
           everyone involved.  Really.
    
           On the other hand, if you have a question as to how to accomplish
           a particular task using _awk_ or _gawk_ , send an email to **help-**
           **gawk@gnu.org** with your request for help.
    


## BUGS



           The **-F** option is not necessary given the command line variable
           assignment feature; it remains only for backwards compatibility.
    
           This manual page is too long; _gawk_ has too many features.
    


## EXAMPLES



           Print and sort the login names of all users:
    
                **BEGIN     { FS = ":" }**
                     **{ print $1 | "sort" }**
    
           Count lines in a file:
    
                     **{ nlines++ }**
                **END  { print nlines }**
    
           Precede each line by its number in the file:
    
                **{ print FNR, $0 }**
    
           Concatenate and line number (a variation on a theme):
    
                **{ print NR, $0 }**
    
           Run an external command for particular lines of data:
    
                **tail -f access_log |**
                **awk '/myhome.html/ { system("nmap " $1 " >> logdir/myhome.html") }'**
    


## COPYING PERMISSIONS



           Copyright © 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
           1999, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2012,
           2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023,
           2024, 2025 Free Software Foundation, Inc.
    
           Permission is granted to make and distribute verbatim copies of
           this manual page provided the copyright notice and this permission
           notice are preserved on all copies.
    
           Permission is granted to copy and distribute modified versions of
           this manual page under the conditions for verbatim copying,
           provided that the entire resulting derived work is distributed
           under the terms of a permission notice identical to this one.
    
           Permission is granted to copy and distribute translations of this
           manual page into another language, under the above conditions for
           modified versions, except that this permission notice may be
           stated in a translation approved by the Foundation.
    


* * *