我对文件 rainforest31_*.xvg 运行“ls -lX”。我运行一个命令,搜索 ls 命令输出第五列的数字,该数字大于 20000。它看起来像这样:
ls -lX umbrella31_*log | awk '{if($5 >=20000) {print}}' | wc -l
并输出一个数字(第 5 列数字 > 20000 的行数)。
当我在脚本中包含上述命令时:
#!/bin/bash -x
ls -lX umbrella31_*log | awk '{if($5 >=20000) {print}}' | wc -l
并运行它,我在屏幕上也得到了打印的“ls”的结果(我不想要)。我怎样才能让我的脚本像屏幕上的命令一样运行,并且只打印所需的行数?
答案1
您的脚本将把管道中的每个命令打印到终端,因为您使用该-x
标志运行它。来自man bash
:
-x Print commands and their arguments as they are executed.
但是,您使用的方法ls
并不是wc
计算文件数量的最佳方法。
要查找 >= 20000 的文件,您可以使用寻找:
find -type f -maxdepth 1 -name 'umbrella31_*log' -size +19999c -ls
(因为如何找到解释器 + 符号(大于四舍五入)你得到 n+1,因此奇数-size n
)
计数输出:
(当我们计算文件数量时,我们只打印换行符,因为我们实际上不需要输出)
wc -l < <(find -maxdepth 1 -type f -name 'umbrella31_*log' -size +19999c -printf \\n)
-最大深度 n
下降到起点以下最多几级(非负整数)的目录层级。
-尺寸 n
文件使用 n 个空间单位,向上舍入。
-ls
在标准输出上以 ls -dils 格式列出当前文件。
答案2
更新答案
发布问题中使用的脚本后发现:
#!/bin/bash -x
用于将-x
所有命令输出到终端的选项。
删除后-x
原问题解决。
原始答案
您缺少参数标志指示符,因此:
ls lX umbrella31_*log | awk '{if($5 >=20000) {print}}' | wc -l
应改为:
ls -lX umbrella31_*log | awk '{if($5 >=20000) {print}}' | wc -l
在我的系统上寻找 bash 脚本它的工作方式如下:
$ ls -lX *.sh
-rwxrwxr-x 1 rick rick 4183 Jul 1 10:48 aptfileparse.sh
-rwxrwxr-x 1 rick rick 339 Jul 24 17:26 checkrunning.sh
-rwxrwxr-x 1 rick rick 506 Jul 15 17:54 Downloads.sh
-rwxrwxr-x 1 rick rick 78 Jul 6 11:28 runall.sh
$ ls -lX *.sh | awk '{if($5 >=200) {print}}' | wc -l
3