Linux (CentOs) 统计文件单词数量

本文介绍了如何在Linux(CentOS)系统中利用状态机原理统计文件中的单词数量。通过跟踪字符状态(OUT和IN),在遇到字母时切换状态,从而计算单词总数。

声明:如有侵权,请联系删除。本篇源头是我的一个朋友@Abieai的博客。

1、原理:

  状态机初始化状态设置为OUT状态,当识别为字母时就会进入IN状态,中间如果遇到分隔符的话,就会再次变为OUT状态,通过计算状态变换的次数,来计算单词的数量。也就是所有字符=字母+分隔符。根据状态机的OUT和IN状态变换来判断一个文件中的字符数量。

2、实现:

#include <stdio.h>

#define OUT  0	//设置OUT状态
#define IN   1	//设置IN状态

#define INIT  OUT   //初始化状态


int count_word(char *filename){ //文件名

    int status=INIT;//初始化状态
    int word=0;//单词量初始数

    FILE *fp = fopen(filename,"r");//可读权限
    if(fp == NULL)  return -1;

    char c;
    while((c=fgetc(fp))!=EOF){
        if((c<65||c>90)&&(c<97||c>122)){//非字母的
            status=OUT;
        }else if(OUT==status) {
            status=IN;
            word++;
        }
    }
    return word;
}

int main(int argc,char *argv[]){
    if(argc<2)return -1;
    printf("word %d\n",count_word(argv[1]));//输出单词总数

}

 

<think>好的,我现在需要解决用户的问题,就是在Linux环境下执行一系列命令操作,具体包括: 1. 使用cat、grep、管道符和wc命令处理家目录下的所有文件统计包含'bash'的行数和单词总数。 2. 使用find命令查找系统中带有'centos'的文件,以及在/usr目录下大于100MB的文件。 首先,我得先理清楚每个步骤的具体实现方法,确保命令的正确性,同时注意可能的陷阱或错误点。 对于第一个任务,用户希望将家目录下的所有文件存储到test.txt中,然后进行处理。这里可能需要使用重定向或者相关命令来生成test.txt。但首先,如何正确获取家目录下的所有文件路径? 通常,家目录的位置可以用~表示,所以可以使用find命令来查找所有文件,比如: find ~ -type f > test.txt 这样就能将家目录下所有普通文件的路径保存到test.txt中。不过用户提到“存储到test.txt”,所以可能需要先执行这一步。但用户的问题描述中是否已经存在test.txt?可能需要确认。根据引用[1]和[2],用户之前可能已经通过cat test.txt来获取内容,但可能这里的test.txt是需要生成的,包含家目录下所有文件的内容?或者可能用户是希望将家目录的文件列表保存到test.txt? 这里可能存在歧义。假设用户是想将家目录下的所有文件的内容合并到test.txt中,那可能需要用cat命令,但家目录下的文件可能包含子目录,直接cat可能会失败,因为cat不能直接处理目录。所以可能用户实际想要的是将家目录下所有文件的路径保存到test.txt,或者将所有文件的内容合并到test.txt。需要进一步分析。 不过根据用户的问题描述:“查看家目录文件统计关键字行数与单词数量”,可能更合理的做法是将所有文件的内容进行处理。但是家目录下可能有很多子目录和文件,直接使用cat处理可能会有问题,比如无法读取目录。因此,可能需要用find配合-exec cat来将所有文件内容输出到test.txt。例如: find ~ -type f -exec cat {} \; > test.txt 这样可以将所有文件内容合并到test.txt中。不过这会处理所有文件,包括二进制文件,可能会导致test.txt内容混乱。不过用户可能假设这里处理的是文本文件,所以继续按这个思路进行。 生成test.txt后,接下来的步骤是用grep和wc统计包含'bash'的行数和单词总数。根据引用[3],可以使用: grep "bash" test.txt | wc -l 来统计行数。对于单词总数,可能需要使用grep的-o选项来输出所有匹配的单词,然后通过wc -w统计,或者使用wc -w统计整个匹配行的单词数。但用户的需求是统计包含'bash'的行中的单词总数,这可能有两种情况:每个匹配行的总单词数,或者每个匹配行中'bash'出现的次数作为单词数。需要明确用户的需求。假设是统计所有包含'bash'的行中的总单词数,可以使用: grep "bash" test.txt | wc -w 但wc -w会统计所有单词的总数,而不仅仅是匹配行的单词。这可能不是用户想要的。另一种方法是,先使用grep提取出所有包含'bash'的行,然后对每一行的单词数进行统计,再将所有行的单词数相加。这可能需要使用awk来处理: grep "bash" test.txt | awk '{sum += NF} END {print sum}' 其中NF表示每行的字段数,即单词数。但用户是否希望这样的统计?需要明确。但根据用户的问题描述,可能是简单的统计包含'bash'的行数,以及这些行中的单词总数,即每行的单词数之和。所以这个部分可能需要用awk来处理。 不过用户提到“使用cat、grep、管道符和wc命令”,所以可能希望仅用这些命令组合,而避免使用awk。此时,如果使用wc -w,会统计所有匹配行的单词总数吗?例如: grep "bash" test.txt | wc -w 这里,grep的输出是每一行包含'bash'的行,然后wc -w统计这些行中的总单词数。这应该是正确的。因此,用户的问题中的“对应单词总数”可能指的是所有包含'bash'的行中的单词总和,因此这个命令是合适的。 接下来,使用find命令查找系统中带有'centos'的文件。这里需要注意,“系统中”可能是指整个文件系统,所以需要从根目录开始查找,但需要足够的权限。命令可能是: find / -name "*centos*" 2>/dev/null 这里,使用-name "*centos*"来匹配文件名中包含centos文件,2>/dev/null是为了忽略权限拒绝的错误信息。但用户可能需要处理权限问题,所以需要提示可能需要sudo。 另外,用户还要求查找/usr目录内大于100MB的文件。大于100MB可以使用-size参数,但find的-size参数的单位需要注意。例如,100MB是100*1024*1024 bytes,或者使用+100M表示超过100MB。正确的参数是: find /usr -type f -size +100M 这里,+100M表示大于100MB。注意单位的大小写,M是大写,而k是小写等。 现在,总结各个步骤的命令: 1. 生成test.txt,包含家目录下所有文件的内容: find ~ -type f -exec cat {} \; > test.txt 不过,这会合并所有文件的内容到test.txt,可能包含大量数据且处理时间长。但用户的问题可能希望将家目录下的文件名保存到test.txt,或者将文件内容保存?这点可能需要澄清。例如,用户可能想将家目录下的文件列表保存到test.txt,而不是内容。如果是这样的话,命令应该是: find ~ -type f > test.txt 这样test.txt中每一行是一个文件的路径。之后,如果要统计这些文件中包含'bash'的行数,需要处理每个文件的内容。这时候,用户可能想用xargs来处理这些文件。例如: cat test.txt | xargs grep "bash" | wc -l 或者,直接使用grep的递归功能: grep -r "bash" ~ | wc -l 但用户的问题明确提到要使用cat、grep、管道符和wc,所以可能需要先生成test.txt,然后处理。但具体步骤可能需要明确。 现在,可能用户的问题存在歧义。假设用户希望将家目录下的所有文件的内容存储到test.txt,那么生成test.txt的命令是: find ~ -type f -exec cat {} \; > test.txt 然后统计其中包含'bash'的行数和单词数: 行数:grep "bash" test.txt | wc -l 单词总数:grep "bash" test.txt | wc -w 但需要注意的是,如果test.txt是由多个文件内容合并而成,那么grep会正确统计所有出现的行。 接下来,find命令部分: 查找系统中带有'centos'的文件: find / -name "*centos*" 2>/dev/null 查找/usr目录下大于100MB的文件: find /usr -type f -size +100M 综合以上分析,现在需要将步骤分解,并确保每个命令的正确性,同时注意可能的权限问题,比如需要sudo来执行系统范围的查找。 另外,在生成test.txt时,如果家目录中存在大量文件或大文件,可能会导致test.txt非常大,影响性能,可能需要提醒用户注意。 现在,将步骤整理成用户的答案,并确保符合格式要求,包括使用正确的引用标记,如引用[^2]和[^4]关于管道符和find命令的使用。 可能的问题点: - 是否正确处理了家目录下所有文件的内容? - 统计单词总数的方法是否正确? - find命令的参数是否正确? 例如,统计单词数使用wc -w是否准确?假设用户需要的是每个匹配行中的单词数总和,那么grep "bash" test.txt会输出所有包含bash的行,然后wc -w统计这些行中的总单词数,这是正确的。但需要注意,单词的定义是以空格分隔的字符串。 另外,在查找文件时,文件名是否区分大小写?默认情况下,find的-name是区分大小写的,如果用户需要不区分,应使用-iname。 但用户的问题中要求的是“带'centos'的文件”,可能默认区分大小写,所以保留原命令。 最后,生成相关问题,需要与主题相关,比如管道符的使用、find命令的其他用法、统计行数和单词数的其他方法等。</think>### 操作步骤 #### 一、统计家目录下所有文件中包含'bash'的行数及单词总数 1. **生成家目录文件列表到test.txt** ```bash find ~ -type f > test.txt ``` 此命令将当前用户家目录下所有普通文件的路径保存到test.txt中。 2. **统计包含'bash'的行数** ```bash cat test.txt | xargs grep "bash" | wc -l ``` 通过管道符将文件列表传递给`grep`过滤含'bash'的行,再用`wc -l`统计行数[^2][^3]。 3. **统计包含'bash'的单词总数** ```bash cat test.txt | xargs grep -o "bash" | wc -w ``` `grep -o`仅输出匹配的单词,`wc -w`统计总次数(每个匹配的'bash'计为一个单词)[^3]。 --- #### 二、使用find命令查找文件 1. **查找系统中文件名含'centos'的文件** ```bash find / -name "*centos*" 2>/dev/null ``` `/`表示从根目录开始搜索,`2>/dev/null`忽略权限错误。 2. **查找/usr目录下大于100MB的文件** ```bash find /usr -type f -size +100M ``` `-size +100M`表示文件大小超过100MB。 --- ### 注意事项 - 若需处理文件内容(非文件路径),可将第一步改为合并所有文件内容: ```bash find ~ -type f -exec cat {} \; > test.txt ``` 再通过`grep "bash" test.txt | wc -l`统计行数,`grep "bash" test.txt | wc -w`统计单词总数。 - 系统级搜索(如`find /`)可能需要`sudo`权限。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

作家不写作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值