我每周运行crontab来收集信息并创建一个日志文件。

我有一个针对该每周文件运行的脚本,仅将特定的状态行输出到我的显示器。

#!/bin/sh

# store newest filename to variable
HW_FILE="$(ls -t /home/user/hwinfo/|head -1)"

# List the Site name, hardware group, Redundancy or Health status', and the site divider
grep -i 'Site\|^\*\*\|^Redundancy\|^Health\|^##' /home/user/hwinfo/$HW_FILE
echo "/home/user/hwinfo/"$HW_FILE
exit 0

这是一个示例输出:

Accessing Site: site01
** FANS **
Redundancy Status : Full
** MEMORY **
Health : Ok
** CPUs **
Health : Ok
** POWER SUPPLIES **
Redundancy Status : Full
##########################################
Accessing Site: site02
** FANS **
Redundancy Status : Full
** MEMORY **
Health : Degraded
** CPUs **
Health : Ok
** POWER SUPPLIES **
Redundancy Status : Full
##########################################
Accessing Site: site03
** FANS **
Redundancy Status : Failed
** MEMORY **
Health : Ok
** CPUs **
Health : Ok
** POWER SUPPLIES **
Redundancy Status : Full
##########################################
/home/user/hwinfo/hwinfo_102217_034001.txt

有没有办法显示cat/grep/sed/awk/perl/当前输出,以便任何以RedundancyHealth开头但不以FullOk结尾的行都被着色?

我想看的是这个

我尝试将当前输出传递到| grep --color=auto \bRedundancy\w*\b(?<!Full)\|\bHealth\w*\b(?<!Ok)失败。任何帮助将不胜感激。

最佳答案

在任何UNIX机器上的任何 shell 中的任何awk中:

awk -v on="$(tput setaf 1)" -v off="$(tput sgr0)" '$1~/^(Health|Redundancy)$/ && $NF!~/^(Full|Ok)$/{$0 = on $0 off} 1'  file

bash - 如何为以string1开头但不以string2结尾的行上色-LMLPHP

您实际上应该使用更健壮的表达式进行字符串比较,而不要使用当前的宽松regexp:
awk -v on="$(tput setaf 1)" -v off="$(tput sgr0)" '
(($1=="Health") && ($NF!="Ok")) || (($1=="Redundancy") && ($NF!="Full")) { $0 = on $0 off }
1'  file

关于bash - 如何为以string1开头但不以string2结尾的行上色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48410744/

10-10 17:51