bash - Bash,将 grep 的结果相加
问题描述
在 bash 中,我想回显一些整数值,它是各种“grep | wc -l”组合的总和。
我努力了
echo $( (`grep string file.txt | wc-l`) + (`grep string2 file.txt | wc -l`))
我假设这些 grep 的返回只是 bash 可以识别的整数,但事实并非如此。我在哪里需要明确,为什么?
解决方案
简化您的内部命令(使用seq
产生行)但保持相同的括号,这不起作用:
$ echo $( (`seq 5 | wc -l`) + (`seq 10 | wc -l`))
-bash: command substitution: line 1: syntax error near unexpected token `+'
-bash: command substitution: line 1: ` (`seq 5 | wc -l`) + (`seq 10 | wc -l`)'
Bash 中的算术扩展是两个相邻的括号:
$ echo $(( 1+2 ))
3
这有效:
$ echo $((`seq 5 | wc -l` + `seq 10 | wc -l`))
15
与更现代的版本一样:
$ echo $(( $(seq 5 | wc -l) + $(seq 10 | wc -l) ))
15
所以你的括号不匹配并且间距不正确。
作为旁注,如果您可以重构两者grep
以产生一个输出,例如:
$ grep "string 1|string2" | wc -l
正如 Charles Duffy 建议的那样,通过在子 shell 或同一个 shell 中进行命令分组,您可以将两个 greps 输出组合在一个流中。那么你不需要echo
or 算术。
作为来自两个不同流程的生产线的简单模型seq
,您可以执行以下操作:
$ (seq 10; seq 5) | wc -l # sub shell
15
$ { seq 5; seq 10; } | wc -l # same shell
15
最后,在某种程度上,你有“各种”grep | 的总和。wc -l" 组合" 您可能会认为awk
是更好的grep
+wc
替换。
你可以做:
awk '/string1/{c++} /string2/{c++} END{print c+0}' file.txt
以及比您单独在 Bash 中应该做的更复杂的组合。如果您有许多不同的搜索字符串,它将执行得更好。
推荐阅读
- python - 如何以第二个值插入每小时数据?
- javascript - UnhandledPromiseRejectionWarning 用于调用另一个块中定义的异步函数
- f# - 有没有办法使用 f# 创建具有多个选择的菜单?通过传递命令
- user-interface - 实现 VR UI/菜单?(尝试过教程但没有帮助)
- wordpress - 在 WooCommerce 中选择租期时显示折扣和产品数量
- firebase - Cloud Functions 模拟器需要安装模块“firebase-admin”
- wordpress - 是否可以在 Wordpress Gutenberg Editor 中使用可拖动项目?
- python - 从 .txt 文件的列中提取特定数据(括号内)?
- python - tensorflow tf.data.experimental.rejection_resample 即使有种子值也没有达到目标分布
- python - PlayerForm.is_valid 始终为 false,但玩家仍在保存