我是Linux shell的新手。我知道有一些工具可以做这件事,比如awk。但我想知道我是否可以使用 grep 或 wc 或其他命令来做到这一点?awk对我来说似乎很吓人。谢谢。
我尝试了 grep 和 wc,就像这样:
grep tol test.txt | wc -w
但是 grep 会给我整条线。
如果我尝试以下操作:
grep '^tol$*' test.txt | wc -w
它只计算以 mol 开头的线。
我怎样才能对以 tol 开头的单词进行 grep?
类似的东西:
grep -o '<tol[[:alpha:]]*>' test.txt | wc -w
<
- 对于单词的开头,
>
- 单词的结尾。
[[:alpha:]]
- 避免匹配像 tol123 这样的组合(你说你只需要单词(。
-o
- 仅显示匹配项,而不显示整行。
你可以相当简单地用awk
做同样的事情,例如
awk '{for(i=1;i<=NF;i++) $i~/^tol/ && n++} END {print n}'
例
$ echo -e "tolerance topaz tolstoynbats toluene toledo" |
> awk '{for(i=1;i<=NF;i++) $i~/^tol/ && n++} END {print n}'
4
另一种选择是将所有空格字符转换为换行符,以便每个单词都以新行开头,然后grep
可以自行计算它们:
echo -e "tolerance topazttolstoynbats toluene toledo" | tr '[:space:]' 'n' | grep -c "^tol"
4
或者,如果使用名为words.txt
的文件:
tr '[:space:]' 'n' < words.txt | grep -c "^tol"