如何在Unix shell脚本中使用echo和grep?

7

我需要在shell脚本中使用echo与grep,我能够使用它吗?

我尝试了这个,但是不正确:

echo Linux: grep "Linux" ~/workspace/ep-exercicios/m1/e2/intro-linux.html | wc -w

我需要展示消息:
Linux: (number of Linux word on the document).

例子:

Linux: 945
3个回答

4

使用 grep 命令并加上 -o 选项:

printf "%s: %s\n" "Linux : " "$(grep -o "Linux" ~/workspace/ep-exercicios/m1/e2/intro-linux.html | wc -w)"

应该这样做

grep 的 man 页面说:

-o, --only-matching
仅打印匹配行中与模式匹配的(非空)部分,每个这样的部分显示在单独的一行。


4
值得解释一下你为什么使用了“-o”选项,同时值得注意的是,它是GNU grep扩展,并非所有Unix变体都可用。 - Jonathan Leffler
@JonathanLeffler:谢谢。我一直以为grep代表GNU正则表达式打印。这真是大开眼界! - Мона_Сах
3
最初,它是"g/re/p"的速记,这是一个"ed"命令,用于“全局搜索正则表达式并打印”——在“vi”可用之前的那些日子里,“ed”是标准编辑器。 - Jonathan Leffler
@JonathanLeffler:哦!我明白了 :) - Мона_Сах
使用 grep -o 而不是 grep -c,这样你就可以将 Linux and Linux are the systems I use most 中的 Linux 计算两次。 - Walter A

3

grep -o | wc -l 的逻辑来自其他答案,可以在大多数系统上使用。

这里是另一种使用 awk 的机制。

awk 'END{print RS " : " NR-1}' RS=Linux ~/workspace/ep-exercicios/m1/e2/intro-linux.html

逻辑:将文件拆分为记录,记录分隔符为“Linux”。最后,打印记录数。
例:对于包含以下内容的文件:
Linux是类Unix和大多数符合POSIX的计算机操作系统(OS),在自由和开源软件开发和分发模型下组装。 Linux的定义组件是Linux内核,这是一个操作系统内核,由Linus Torvalds于1991年10月5日首次发布。自由软件基金会使用名称GNU / Linux来描述操作系统,这引起了一些争议
记录将是:
1. The 2. 是类Unix和大多数符合POSIX的计算机操作系统(OS),在自由和开源软件开发和分发模型下组装。 Linux的定义组件是 3. 内核,这是一个操作系统内核,由Linus Torvalds于1991年10月5日首次发布。自由软件基金会使用名称GNU / 4. 来描述操作系统,这引起了一些争议
Linux出现的次数为4 == 最后一个记录号 - 1。

我重申你在开始时提出的观点-“rep -o | wc -l”逻辑从其他答案中应该适用于大多数系统,另外赞同你的逻辑。 - sjsam
是的...大多数(不是全部)和今天是那个中重要的词 :D - anishsane

1

您可以通过以下轻微修改来实现。

echo "Linux: `grep "Linux" ~/workspace/ep-exercicios/m1/e2/intro-linux.html | wc -w`"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接