我在终端上输入了以下命令:
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 "
它正确输出文件大小,但没有以红色突出显示。所以我假设我的语法可能有问题,但我没有遇到任何错误。
知道为什么会这样吗?
答案 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
--color
同时允许--colour
和a
。为了避免混淆,我在这里使用了文本中的第一个,尽管我通常使用第二种习惯。答案 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);
});