Bash Shell Count Number of Characters In a String or Word

last updated in Categories

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:


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

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

Sample outputs:


Count Number of Characters Using Bash Only

You can use Bash parameter expansion as follows:

x="This is a test"
echo "$y"
echo "${#y}"

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

x="This is a test. 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

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

11 comment

  1. 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:
    echo “${#y}”
    I don’t know what they mean. Thank you.

      1. 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.

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

  2. 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

  3. [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?

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


      for file in “$(ls $dir)”
      if [ “$file” -gt “32” ]; then
      echo “Filename is more than 32 chars!”
      echo “Filename is NOT more than 32 chars!”

      Wrote this on the fly, should work.

    Still, have a question? Get help on our forum!