Bash:使用ls,awk和grep列出文件大小

时间:2017-10-11 04:03:52

标签: linux bash awk grep ls

我在终端上输入了以下命令:

ls -l someFile | awk '{print $5}' | grep [0-9]

根据我的理解,ls -l打印当前目录中具有长格式(包括权限)的目录和文件列表,因此管道awk(从列表中打印所需的字段,其大小为文件)和grep [0-9]给了我想要的正确输出,这是用红色突出显示的文件大小。

例如: drwxr-xr-x 2 zdgx6学生103 Feb 23 2017 delosreyes_hw1

输出为103(因为它的大小和字体是红色的)

然而,当我在我的Bash脚本上尝试这个时 像这样:echo " $file size: $( ls -l "$file" | awk '{print $5}' | grep [0-9] ) $regfile "

它正确输出文件大小,但没有以红色突出显示。所以我假设我的语法可能有问题,但我没有遇到任何错误。

知道为什么会这样吗?

3 个答案:

答案 0 :(得分:1)

如果符合以下情况,Gnu grep会突出显示每行的匹配部分:

  • 您提供命令行参数--color=always [注1]或

  • stdout是终端,您要么提供命令行参数--color=auto,要么不指定--color(因为auto是默认设置)。

grep内运行$(...)以便将输出作为bash扩展的一部分进行捕获,这意味着stdout将被重定向到不是终端的管道。因此,除非您指定--color=always,否则将禁用匹配着色。当你处理grep的输出时,通常会想要你想要的。

所以你可以"修复"这可以通过使用--color=always选项来实现,但实际上更简单的解决方案是直接发送颜色控制代码,因为这是唯一原因,您使用的是grep

可以使用tput实用程序以合理的方式发送颜色代码,ncurses实用程序是tput bold # Sets boldface (Otherwise, the colour will be washed out) tput setaf 1 # 1 is red. 2 is green, 3 yellow, 4 blue, 5 magenta, 6 cyan and 7 white 包的一部分,通常安装在任何Linux / BSD系统上。您需要以下代码:

tput sgr0    # Normal colour and style

输出突出显示的文本后,您需要将控制台重置为正常:

echo "$file size: $(tput bold)$(tput setaf 1)$(ls -l "$file" | awk '{print $5}')$(tput sgr0) $regfile"

所以你可以做,例如:

tput

如果你做了很多,你可能想要在bash变量中保存bold_red=$(tput bold)$(tput setaf 1) reset_col=$(tput sgr0) echo "$file size: $(tput bold)$(tput setaf 1)$(ls -l "$file" | awk '{print $5}')$(tput sgr0) $regfile" 输出:

printf "%s size: \033[1;31m%s\033m %s\n" "$file" "$(ls -l "$file" | awk '{print $5}')" "$regfile"

如果你知道它们是什么,你也可以硬编码典型的控制台代码:

grep

注释

  1. 为了我们这些有不同英语拼写概念的人的利益,--color同时允许--coloura。为了避免混淆,我在这里使用了文本中的第一个,尽管我通常使用第二种习惯。

答案 1 :(得分:1)

echo "$(tput setaf 1)$(stat -c '%B' file.log)$(tput sgr0)"
512  

您不应使用ls来解析任何文件的详细信息,而是可以使用stat。您可以发出stat --help来检查stat命令提供的各种标志的详细信息。同样,您不必使用任何其他pipe来加入awk

答案 2 :(得分:0)

谢谢大家!我发现使用grep --color =始终是我问题的最简单的解决方案。其他建议也有效,但我们没有在课堂上讨论这些命令。 这是我的代码:

registerNFCTag(body)
                .map(result ->throwExceptionIfFailure(result))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(
                        result -> {
                            toggleLoaders(true);
                            appToast(getString(R.string.done_msg) + tagName);
                        }
                        , throwable -> {
                            Toasty.error(this, throwable.getLocalizedMessage()).show();
                            toggleLoaders(true);
                        });