How do I extract digits only from a given string under Bash shell?
You can use the sed, grep and other shell utilities as follows:
grep -o "[0-9]" <<<"input" grep -o "[0-9]" <<<"$var" grep -o "[0-9]" <<<"test123" grep -o "[0-9]" <<<"1Th5is is a test. 5" var="foo1bar2" output=$(grep -o "[0-9]" <<<"$var") echo "$output" grep -oE "[[:digit:]]{1,}" input.file
See our grep command and grep regex tutorial for more information.
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop











![Linux: Find Out My Group Name [ Group Memberships ]](http://s13.cyberciti.org/images/shared/rp/3/17.jpg)


{ 9 comments… read them below or add one }
Try using ‘tr’, e.g.,
$ echo ‘asd;lfj29834slkjajfds298124768ald;09290dsfasd098089adfs’ | tr -d [:alpha:] | tr -d [:punct:]
2983429812476809290098089
Or simply doing this:
echo “ljhdfkldkfs23094823sdklnklsd23984nks8d8d8s” | tr -cd [:digit:]
Can we use regex in grep? For example, I only want to extract the http links for every line of my file. Is it possible?
Yes Cenk. RegEx are included.
Read The Fantastic Manual, give it a try, and then share your results with us once you are done. Good reading.
Looking forward to reading from you.
GREP(1) User Commands GREP(1)
NAME
grep, egrep, fgrep, rgrep – print lines matching a pattern
SYNOPSIS
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
DESCRIPTION
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given
as file name) for lines containing a match to the given PATTERN. By default, grep prints the matching lines.
In addition, three variant programs egrep, fgrep and rgrep are available. egrep is the same as grep -E. fgrep is the
same as grep -F. rgrep is the same as grep -r. Direct invocation as either egrep or fgrep is deprecated, but is
provided to allow historical applications that rely on them to run unmodified.
OPTIONS
Generic Program Information
–help Print a usage message briefly summarizing these command-line options and the bug-reporting address, then exit.
-V, –version
Print the version number of grep to the standard output stream. This version number should be included in all
bug reports (see below).
Matcher Selection
-E, –extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see below). (-E is specified by POSIX.)
-F, –fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is
specified by POSIX.)
-G, –basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see below). This is the default.
-P, –perl-regexp
Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of
unimplemented features.
Matching Control
-e PATTERN, –regexp=PATTERN
Use PATTERN as the pattern. This is useful to protect patterns beginning with hyphen-minus (-). (-e is
specified by POSIX.)
In bash, you don’t need any external command:
var=1qa2ws3ed4rf printf "%s\n" "${var//[![:digit:]]/}"Real cool Chris.
I knew Brace Expansion tricks with search/replace pattern, but I never read [bash] accepted RegEx as a pattern. (It does not seem to be written into [bash] [man] page.
Where did you read it first? That would be great to know. Bash-Hackers site ?
So I read here
http://wiki.bash-hackers.org/syntax/pattern
that bash patterns are not exactly equivalent to RegEx, but accepts POSIX character class, as you good remembered us.
Thanks a lot, Chris, and thanks Vivek for his Fantastic Site!
Bash does not use regular expressions (execpt in [[ xxx =~ regex ]]); it uses filename expansion rules, which also accepts character classes.
I could just as well have used [!0-9] instead of the character class:
printf "%s\n" "${var//[!0-9]/}"For digits usually okay, but for everything else it’s not recommended to use an explicit set like [A-Z] instead of [[:upper:]]