首先我正在执行以下命令。
执行的命令:
/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
=
错误是因为作业中的前后有空格。这是 shell 脚本中的错误。使用
var=value
,不使用var = value
。否则,shell 将尝试执行名为var
- 的程序,从而出现command not found
错误消息。你需要使用命令替换将命令的输出获取到变量中。例如
ZK_STATUS=$(/app/zookeeper/zookeeper-3.4.10/bin/zkServer.sh status)
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)
如果您想计算 的每个单独出现次数
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
一个整体单词,例如为了不计算follower
infollowers
或followership
,您可以将该-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}'