如何计算命令输出中单词的出现次数

如何计算命令输出中单词的出现次数

首先我正在执行以下命令。

执行的命令:

/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status

命令的输出:

ZooKeeper JMX enabled by default
Using config: /app/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower

我想使用“follower”这个词进行 grep 并打印该词的总数 ( grep 'follower' | wc -l)。

我在这里面临的问题是我无法将命令的输出放入它抛出“命令未找到”的变量中。

-bash-4.2$ cat zookeeper.sh
#!/bin/bash
ZK_STATUS = ` /app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status `
ABC = $ZK_STATUS | grep 'follower' | wc -l
echo $ABC

输出:

-bash-4.2$ ./zookeeper.sh
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/zookeeper-3.4.10/bin/../conf/zoo.cfg
./zookeeper.sh: line 2: ZK_STATUS: command not found
./zookeeper.sh: line 4: ABC: command not found
0

答案1

  1. =错误是因为作业中的前后有空格。这是 shell 脚本中的错误。

    使用var=value,不使用var = value。否则,shell 将尝试执行名为var- 的程序,从而出现command not found错误消息。

  2. 你需要使用命令替换将命令的输出获取到变量中。例如

    ZK_STATUS=$(/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status)
    
  3. grep有一个-c选项来计算匹配行的数量,所以wc -l不需要。

    ZK_STATUS=$(/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status)
    ABC=$(printf '%s' "$ZK_STATUS" | grep -c follower)
    

    或者,更直接地说,

    ABC=$(/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status |
          grep -c follower)
    
  4. 如果您想计算 的每个单独出现次数follower(而不仅仅是计算该单词至少出现一次的行数),那么您不能使用grep -c.

    相反,做类似的事情:

    ABC=$(printf '%s' "$ZK_STATUS" | grep -o follower | wc -l)
    

    grep -o将在其自己的行上打印每个匹配项。 wc -l然后计算这些行。

答案2

对于 GNUgrep或兼容的且给定的非空字符串不包含换行符或 NUL 字符:

string=follower

要计算 some 的输出中包含该字符串的行数cmd

count=$(
  cmd | grep -cFe "$string"
)

要计算该字符串不重叠出现的次数:

count=$(
  cmd | grep -oFe "$string" | wc -l
)

did对于可能重叠出现的次数(例如,考虑in出现 3 次dididid,而不仅仅是 2 次):

count=$(
  cmd | grep -Poe "(?=\Q$string\E)." | wc -l
)

(这里还假设$string不包含\E

如果你想找到$string一个整体单词,例如为了不计算followerinfollowersfollowership,您可以将该-w选项添加到上面的 grep 命令中。实际上,它将查找follower前面或后面都没有字母、数字或下划线的出现(所谓的单词字符)。为了避免计数anti-follower,您需要手动进行排除:

count=$(
  cmd | grep -Poe "(?<![\w-])\Q$string\E(?![\w-])" | wc -l
)

然而在这里,您的问题更多是关于基本的 shell 语法。

要将命令的输出(减去尾随换行符)存储在 shell 变量中:

variable=$(cmd)

( 两边都没有空格=,并避免过时的variable=`cmd`语法)。

要打印变量的内容,后跟一个换行符,以便提供给上述命令grep

printf '%s\n' "$variable" | grep ...

(不要使用echo,请记住在列表上下文中引用您的参数扩展)

尽管在 bash 和其他借用了 zsh<<<运算符的 shell 中,您也可以执行以下操作:

<<< "$variable" grep ...

无论如何,如果目的是检查变量是否至少包含一次该字符串,则应该是(使用标准 shell 语法):

case $variable in
  (*"$string"*) echo variable contains the string;;
  (*) echo It does not;;
esac

(这里$string可能包含换行符)。

或者在以下输出中检查它cmd

if
  cmd | grep -qFe "$string"
then
  echo cmd output contains the string
else
  echo it does not
fi

答案3

您可以在以下命令中获得所需的输出

/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status  \
  | awk '{print gsub("follower",$0)}'

它将显示单词“follower”出现了多少次,在此示例中考虑输出是单行

答案4

在 (GNU) awk 中,将 RS 设置为要NR-1在末尾计数并打印的单词。

cmd | awk -vRS='follower' 'END{print NR-1}'

相关内容