# State machines The `condX{actionX}` shortcut makes it easy to code state machines concisely. This is useful to solve problems that depend on the contents of multiple records. Here's an example of printing the matching line as well as `c` number of lines that follow: ```bash # same as: grep --no-group-separator -A1 'blue' # print matching line as well as the one that follows it $ printf 'red\nblue\ngreen\nteal\n' | awk -v c=1 '/blue/{n=c+1} n && n--' blue green # print matching line as well as two lines that follow $ printf 'red\nblue\ngreen\nteal\n' | awk -v c=2 '/blue/{n=c+1} n && n--' blue green teal ``` Consider the following input file that has records bounded by distinct markers (lines containing `start` and `end`): ```bash $ cat uniform.txt mango icecream --start 1-- 1234 6789 **end 1** how are you have a nice day --start 2-- a b c **end 2** par,far,mar,tar ``` Here are some examples of processing such bounded records: ```bash # same as: sed -n '/start/,/end/p' uniform.txt $ awk '/start/{f=1} f; /end/{f=0}' uniform.txt --start 1-- 1234 6789 **end 1** --start 2-- a b c **end 2** # you can re-arrange and invert the conditions to create other combinations # for example, exclude the ending match $ awk '/start/{f=1} /end/{f=0} f' uniform.txt --start 1-- 1234 6789 --start 2-- a b c ``` Here's an example of printing two consecutive records only if the first record contains `ar` and the second one contains `nice`: ```bash $ awk 'p ~ /ar/ && /nice/{print p ORS $0} {p=$0}' uniform.txt how are you have a nice day ```