我正在尝试学习 Linux 及其命令,但我怀疑我找不到任何回应...

我需要在特定时间(例如:10:00-11:00)搜索和统计一系列文件中的几个词(例如猫、狗、鱼),但我不知道如何继续。

我试图使用 for 循环来使这更容易,但我不知道如何使用我要查找的词来分离和打印名称文件。例如:

=======file_10:01 dogs 10 results 
=======file_10:01 cats 231 results  

等等……

这是我正在执行的代码:

for i in `filename_time*`; do 
    echo "==================== $i" 
    zcat $i | grep -c "dogs" 
done 

除此之外,是否可以搜索不包含在我的循环中的单词并打印出这些单词?

我对此很陌生,如果有人能帮我解决这个“简单”的问题,我会很高兴......

请您参考如下方法:

如果您对命令的输出有这样的硬性要求:

=======file_10:01 dogs 10 results 
=======file_10:01 cats 231 results  

并且您只需要打印包含与您的单词匹配的文本的行数,那么您应该执行如下操作:

for i in filename_time*; do                 # do globbing like this 
    for word in dogs cats; do               # list of words to search for 
        n=`zcat $i | grep -c "$word"`       # get n first 
        echo "=======$i $word $n results"   # now print the spec 
    done 
done 

但是,如果您需要打印一个单词在文件中出现的次数,那么您必须对文件每一行的单词进行分词,将每个分词写在单独的一行,然后执行 grep。换句话说,您必须在管道中插入另一个命令来标记 zcat 编写的每一行中的单词。如果您不希望 dogstand 匹配 dogs,那么您还必须将 grep 命令更改为:

grep -c "^$word\\$" 

awk 命令应该能够标记一行中的单词。使用代码 here例如,您可以这样编写管道:

zcat $i | awk '{for(i=1;i<=NF;i++){printf "%s\n", $i}}' | grep -c "^$word\\$" 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!