File: gawk.info, Node: Using Shell Variables, Next: Action Overview, Prev: Pattern Overview, Up: Patterns and Actions 7.2 Using Shell Variables in Programs ===================================== 'awk' programs are often used as components in larger programs written in shell. For example, it is very common to use a shell variable to hold a pattern that the 'awk' program searches for. There are two ways to get the value of the shell variable into the body of the 'awk' program. A common method is to use shell quoting to substitute the variable's value into the program inside the script. For example, consider the following program: printf "Enter search pattern: " read pattern awk "/$pattern/ "'{ nmatches++ } END { print nmatches, "found" }' /path/to/data The 'awk' program consists of two pieces of quoted text that are concatenated together to form the program. The first part is double-quoted, which allows substitution of the 'pattern' shell variable inside the quotes. The second part is single-quoted. Variable substitution via quoting works, but can potentially be messy. It requires a good understanding of the shell's quoting rules (*note Quoting::), and it's often difficult to correctly match up the quotes when reading the program. A better method is to use 'awk''s variable assignment feature (*note Assignment Options::) to assign the shell variable's value to an 'awk' variable. Then use dynamic regexps to match the pattern (*note Computed Regexps::). The following shows how to redo the previous example using this technique: printf "Enter search pattern: " read pattern awk -v pat="$pattern" '$0 ~ pat { nmatches++ } END { print nmatches, "found" }' /path/to/data Now, the 'awk' program is just one single-quoted string. The assignment '-v pat="$pattern"' still requires double quotes, in case there is whitespace in the value of '$pattern'. The 'awk' variable 'pat' could be named 'pattern' too, but that would be more confusing. Using a variable also provides more flexibility, as the variable can be used anywhere inside the program--for printing, as an array subscript, or for any other use--without requiring the quoting tricks at every point in the program.