Question: How to extract a text part by regexp in linux shell? Lets say, I have a file where in every line is an IP address, but on a different position. What is the simplest way to extract those IP addresses using common unix command-line tools?

Answer: 
I usually start with grep, to get the regexp right.

```
# [multiple failed attempts here]
grep    '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'                 file  # good?
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' file  # good enough

```

Then I'd try and convert it to `sed` to filter out the rest of the line. (After reading this thread, you and I aren't going to do that anymore: we're going to use `grep -o` instead)

```
sed -ne 's/.*\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\).*/\1/p  # FAIL

```

That's when I usually get annoyed with `sed` for not using the same regexes as anyone else. So I move to `perl`.

```
$ perl -nle '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ and print $&'

```

Perl's good to know in any case. If you've got a teeny bit of CPAN installed, you can even make it more reliable at little cost:

```
$ perl -MRegexp::Common=net -nE '/$RE{net}{IPV4}/ and say $&' file(s)

```
I'd suggest perl. (\d+.\d+.\d+.\d+) should probably do the trick. 

EDIT: Just to make it more like a complete program, you could do something like the following (not tested): 

```
#!/usr/bin/perl -w
use strict;

while (<>) {
    if (/(\d+\.\d+\.\d+\.\d+)/) {
        print "$1\n";
    }
}

```

This handles one IP per line. If you have more than one IPs per line, you need to use the /g option. *man perlretut* gives you a more detailed tutorial on regular expressions.