我正在运行 bash 脚本以在日志目录下输出日志。最初我想知道生成了多少日志,只需执行以下操作:
ls logs | wc -l
由于 bash 脚本是实时运行的,我可以进一步使用:
watch -n 5 'ls logs | wc -l'
显示并发日志文件的数量。
但我也知道应该通过检查以下调用的文件下的行数来生成日志文件的总数file.txt
:
cat file.txt | wc -l
现在我想显示通过两个数字相减还需要生成多少个日志,我搜索了,有几种方法可以在shell中进行数学运算,例如使用expr
或使用双括号。例如,假设我的总行数file.txt
是 1000。如果我将其硬编码到命令中,则最终命令将类似于
`watch -n 5 'ls 日志 |厕所-l | xargs expr 1000 - '
但我想1000
用来自命令的结果来代替cat file.txt | wc -l
。我尝试了以下但不起作用。我不确定是否xargs
可以接受来自 2 个命令的两个参数,或者这不是我们在这里使用它的方式。
watch -n 5 'ls logs | wc -l | xargs expr "cat file.txt | wc -l" + '
(注意:如果我只想计算file.txt
不以字母开头#
且不是空行的行数怎么办?我在这里该怎么做?)非常感谢。
答案1
我不确定是否
xargs
可以接受来自 2 个命令的两个参数。
它可以运行一个命令,其中多个参数分布在输入的多行中。例如,这将指示xargs
使用从输入中获取的三个参数运行expr
(按顺序分别是日志数-
和 中的行数file.txt
):
(ls logs | wc -l; printf "%s\n" -; wc -l < file.txt) | xargs -n 3 expr
使用可能更惯用命令替换这里:
expr "$(ls logs | wc -l)" - "$(wc -l < file.txt)"
[W]如果我只想计算 file.txt 中不以 # 字母开头且不是空行的行数,该怎么办?
计数grep
:
grep -c -v -e '^#' -e '^$' file.txt
-c
计算匹配行数-v
反转匹配,因此选择与以下内容不匹配的行-e '^#
匹配^
以 ( )开头的行#
-e '^$
匹配$
在开始 ( ) 后立即结束 ( ) 的行^
,即它们为空。