Shell脚本统计字符串或文件中特定字符出现的次数

在编写Shell脚本中需要判断网址中的/出现的次数,进而获取网址的结构,然后根据需要可以截取部分网址。假设我们有一个字符串“Hello Bash”:

1
2
3
$ STRING="Hello Bash"
$ echo $STRING
Hello Bash

使用 bash shell,我们现在可以计算任何给定字符的出现次数。例如,让我们计算字符 l 出现的次数:

1
2
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' | grep l | wc -l
2

sed 命令首先将任何给定的字符串分成多行。其中每行包含一个字符:

1
2
3
4
5
6
7
8
9
10
11
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' 
H
e
l
l
o

B
a
s
h

之后我们可以使用grep命令来仅搜索特定字符。在本例中,我们仅打印字符 l

1
2
3
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' | grep l
l
l

剩下的就是使用 wc -l 来简单地计算行数:

1
2
$ echo $STRING | sed -e 's/\(.\)/\1\n/g' | grep l | wc -l
2

相同的策略也可用于计算文件中字符的出现次数。下面的 bash shell 命令计算字符 l 在文件 /etc/services 中出现的次数:

1
2
 $ cat /etc/services | sed -e 's/\(.\)/\1\n/g' | grep l | wc -l
9298

然而,计算字符出现次数的另一种方法是使用 grep 的 --only-matching-o 选项仅打印匹配的字符:

1
2
$ grep -o l /etc/services | wc -l
9298