在本教程中,我们将学习使用 Linux 命令查找文本文件中特定字符的计数。
假设你对常用的 Linux 命令有基本的了解,包括
grep
、awk
、tr
和wc
。
rumenz.txt
中有一些虚拟数据:
> cat rumenz.txt rumenz.txt hello world!!!!
grep
命令该
grep
的用于在输入文件中的给定图案的命令的搜索。
让我们通过命令来使用
grep
获取字符数 :
> grep -o 'e' rumenz.txt | wc -l 2
在这里,我们在文件
rumenz.txt
中查找字符e
的出现次数。-o
选项打印在所述匹配部分。
现在,我们使用管道运算符将
grep
命令的输出传递给wc
命令。最后,wc
命令中的-l
选项计算输入字符串中的总行数。
在
grep
的命令支持-i
来进行区分大小写的搜索选项:
> grep -o -i 'l' rumenz.txt | wc -l 3
我们可以将多个输入文件传递给
grep
命令。然后它会查看所有文件并返回在每个文件中找到的字符数总和:
> cat > dummy.txt This is dummy text. $ grep -o -i 'e' rumenz.txt dummy.txt | wc -l 2
在这里,我们已经创建了一个新的文件
dummy.txt
文件,都执行字符计数操作rumenz.txt
和dummy.txt
。
请注意,我们已将两个文件作为参数传递给 grep 命令。输出包括来自两个文件的字符数总和。
tr
命令该
tr
是一个命令行应用程序来执行基于字符的转换。
我们可以结合使用
-c
和-d
两个选项来获取字符数:
> tr -c -d 'l' < rumenz.txt | wc -c 3
让我们首先了解上面命令中使用的选项。
-c
: 取代所有不属于第一字符集的字符-d
: 将删除集合中提到的所有字符集合被定义为字符串。在我们的例子中,集合是一个带有单个字符
l
的字符串。
现在,当我们将
-c
和-d
选项组合在一起时,它将删除除我们在集合中提到的字符之外的所有字符
结果字符串将使用管道运算符传递给
wc
命令。wc
命令中的-c
选项将返回总字符数。
我们可以通过在集合中添加大写和小写字符来执行不区分大小写的搜索
> tr -cd 'lL' < rumenz.txt | wc -c 3
awk
命令在
awk
是一种数据驱动的编程语言的是获取输入数据,处理它,并返回所需的输出。
与我们目前讨论的两种方法不同,这种方法有点难以理解。
让我们看一下命令并了解它是如何工作的:
> awk -F 'e' '{s+=(NF-1)} END {print s}' rumenz.txt 2
awk
应用程序的默认字段分隔符是空格。但是这里我们使用-F
选项将字段分隔符更新为e
。这将在每次出现e
时分隔我们的数据。
为我们的数据集形成的组第一行将是
rum
nz.txt
和第二行h
、llo world!!!!
。
现在,这个片段
{s+=(NF-1)} END {print s}
将计算生成的数据的所有部分并从中减去一(因为一个字符匹配会将数据分成两部分。)以获得所需的每行中的字符数。这个计数将被添加到每一行,最后,我们得到整个文件的总字符出现计数。
到目前为止,我们讨论的所有三种方法都执行相同的操作。但不同之处在于它们处理数据的方式。
现在,对于小字符串或小文件,这些命令执行的时间几乎相同。但真正的区别是当我们的文件太大时。
让我们在一个 1.1GB 的文件上运行所有三个命令并监视每个命令所花费的时间:
> ls -lah large.txt -rw-r--r--. 1 root root 1G Jun 12 10:53 large.txt > time grep -o 'e' large.txt | wc -l 82256735 real 0m 733s user 0m 649s sys 0m 714s > time tr -c -d 'e' > large.txt | wc -c 82256735 real 0m 542s user 0m 892s sys 0m 433s > time awk -Fe '{s+=(NF-1)} END {print s}' large.txt 82256735 real 0m 080s user 0m 589s sys 0m 933s
tr
命令是最快的三个拿到字符数在大型文件。
发现
tr
命令是所有三个命令中最快的,其次是awk
和grep
命令。