我正在尝试学习 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\\$"