I have file like this :

 other lines . . . blah blah blah (:34) 

I wish to find the occurrence of numbers in the above file. I came up with:

grep [0-9] filename 

But that is printing the whole:

blah blah blah (:34) 

Rather I want only 34. Is there any way to do so?

2

5 Answers

You can use grep -E to access the extended regular expression syntax( Same as egrep)

I have created a testfile with below contents:

>cat testfile this is some text with some random lines again some text ok now going for numbers (:32) ok now going for numbers (:12) ok now going for numbers (:132) ok now going for numbers (:1324) 

Now to grep the numbers alone from the text you can use

>grep -Eo '[0-9]{1,4}' testfile 32 12 132 1324 

will be output.

Here "-o" is used to only output the matching segment of the line, rather than the full contents of the line.

The squiggly brackets (e.g. { and }) indicate the number of instances of the match. {1,4} requires that the previous character or character class must occur at least once, but no more than four times.

Hope this helps

3

You can use RE bracket expression [:digit:] specified by section 9.3.5 of POSIX standard , in combination with -o flag to print only matching "words"

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here' 123 

You can use Perl style regular expressions as well

grep -Po "\\d+" filename 

-P Interpret PATTERNS as Perl-compatible regular expressions (PCREs).

-o Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

2

grep -o will print only the matching part of the line. Otherwise grep will print any lines with the pattern.

I would use curl to access your file locally or remotely, then I would grep lines with numbers wrapped in (: ) then cut those pieces off and write to file

the accepted answer ignores there could be numbers in the previous lines of the file, it does work for the example data, but what if the file was remote?

Local

curl file:///home/$USER/Public/input.txt | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt 

In this example output.txt in your current folder will be written over, we are accessing input.txt from your Public folder.

Remote

curl | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt 

In this example output.txt in your current folder will be written over, we are accessing input.txt from .

3

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy