How to grep for contents after pattern?

grep, linux

Solution

grep 'potato:' file.txt | sed 's/^.*: //'

`grep` looks for any line that contains the string `potato:`, then, for each of these lines, `sed` replaces (`s///` - substitute) any character (`.*`) from the beginning of the line (`^`) until the last occurrence of the sequence `:` (colon followed by space) with the empty string (`s/...//` - substitute the first part with the second part, which is empty).

or

grep 'potato:' file.txt | cut -d\   -f2

For each line that contains `potato:`, `cut` will split the line into multiple fields delimited by space (`-d\` - `d` = delimiter, `\` = escaped space character, something like `-d" "` would have also worked) and print the second field of each such line (`-f2`).

or

grep 'potato:' file.txt | awk '{print $2}'

For each line that contains `potato:`, `awk` will print the second field (`print $2`) which is delimited by default by spaces.

or

grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'

All lines that contain `potato:` are sent to an inline (`-e`) Perl script that takes all lines from `stdin`, then, for each of these lines, does the same substitution as in the first example above, then prints it.

or

awk '{if(/potato:/) print $2}' < file.txt

The file is sent via `stdin` (`< file.txt` sends the contents of the file via `stdin` to the command on the left) to an `awk` script that, for each line that contains `potato:` (`if(/potato:/)` returns true if the regular expression `/potato:/` matches the current line), prints the second field, as described above.

or

perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt

The file is sent via `stdin` (`< file.txt`, see above) to a Perl script that works similarly to the one above, but this time it also makes sure each line contains the string `potato:` (`/potato:/` is a regular expression that matches if the current line contains `potato:`, and, if it does (`&&`), then proceeds to apply the regular expression described above and prints the result).

Problem

Given a file, for example: ``` potato: 1234 apple: 5678 potato: 5432 grape: 4567 banana: 5432 sushi: 56789 ``` I'd like to grep for all lines that start with `potato:` but only pipe the numbers that follow `potato:`. So in the above example, the output would be: ``` 1234 5432 ``` How can I do that?

Original source

Related problems