≡ Menu

Bash Shell Count Number of Characters In a String or Word

How do I count and print particular character (say D or digit 7) in a string or variable under Bash UNIX / Linux shell?

You can use UNIX / Linux command such as sed, grep, wc or bash shell itself to count number of characters in a string or word or shell variable.

grep Command To Count Number of Characters

Use the following syntax to count ‘s’ character in a variable called $x:

x="This is a test"
grep -o "s" <<<"$x" | wc -l

Sample outputs:

3

To match both ‘s’ and ‘S’, enter:

x="This is a test. S"
grep -o "[s|S]" <<<"$x" | wc -l

Sample outputs:

4

Count Number of Characters Using Bash Only

You can use Bash parameter expansion as follows:

x="This is a test"
y="${x//[^s]}"
echo "$y"
echo "${#y}"

To match both ‘s’ and ‘S’, enter:

x="This is a test. S"
y="${x//[^s|S]}"
echo "${#y}"

Please note that all instructions were tested using:

  • Debian GNU/Linux, v6.x
  • GNU grep, v2.6.3
  • GNU bash, v4.1.5
Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:



{ 11 comments… add one }
  • Justin Yang June 23, 2011, 2:56 pm

    Hi,
    Just complete this article and feel it’s helpful to me. However, could you offer us more details about the meaning of the following two lines:
    y=”${x//[^s]}”
    and
    echo “${#y}”
    I don’t know what they mean. Thank you.

    • nixCraft June 25, 2011, 2:01 pm

      Find and replace all occurrences of ‘s’ i.e. when pattern begins with /, all matches of pattern are replaced with ‘s’ and stored to $y:

      y=”${x//[^s]}”

      To find string ($y) length:

      echo “${#y}”

      See HowTo: Use Bash Parameter Substitution Like A Pro for more info.

      • Richard Black March 18, 2015, 6:02 pm

        Here is the breakdown for y=”${x//[^s]}”

        This assumes that you already understand y=”${x}” and somewhat understand %, %%, # and ##.

        / indicates we will be doing pattern substitution as described in the bash man page.

        The pattern section is “/[^s]”

        This pattern has a leading “/” which means bash will replace all matches of pattern.

        The pattern itself “[^s]” means to match any character that is not an “s”. Look up leading “^” inside of square brackets “[ ]”.

        The string is not included because we want to delete any character that is not an “s”. Because the replace string is empty then the “/” that divides pattern from string is not included.

        Then $y is left with only “s”s because everything else has been deleted. So “${#y}” will give you the total count of characters in $y.

        • prashant singh September 30, 2015, 11:19 am

          Hi Richard – Thanks a lot for the excellent explanation ……. as more theory more confusion ….some time :) .Thanks again!!

  • Justin Yang June 25, 2011, 3:32 pm

    Thank you for your reply with that good link you give.

  • mandela900 June 27, 2011, 8:22 am

    A=”Ciao Mondo”
    echo ${#A}
    10

    • nixCraft June 29, 2011, 4:42 pm

      A whitespace is also counted as a character.

    • hitendra April 11, 2013, 3:44 pm

      thanku

  • Uchmann July 14, 2011, 8:12 am

    Thanks for the post
    is it wrong doing it this way.
    1. Use the following syntax to count ‘s’ character in a variable called $x:
    echo “$x” | grep -o “s” | wc -l

    2. To match both ‘s’ and ‘S’, enter:
    echo “$x” | grep -oi “s” | wc -l

  • Adilson April 6, 2013, 3:20 pm

    [Fedora Linux & Debian Linux]

    hello, thanks for scripts.
    I have a directory with 100 files.
    I wonder which of those 100 files has more than 32 characters in the name.
    can you help me?
    Thanks

    • Jared June 4, 2014, 3:10 pm

      #!/usr/bin/env bash
      # if $filename more than 32 then
      # @param $1 directory

      dir=$1

      for file in “$(ls $dir)”
      do
      file=”${#file}”
      if [ “$file” -gt “32” ]; then
      echo “Filename is more than 32 chars!”
      else
      echo “Filename is NOT more than 32 chars!”
      fi
      done

      Wrote this on the fly, should work.

Security: Are you a robot or human?

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: , , , , ,