我在input.txt文件中有以下详细信息。我的要求是匹配模式"停止|中止|不运行"在任何一行中,都需要打印该行。如果所有人都在"跑步"州需要打印一条消息,其中包含所有正在运行的消息"。
SVRSVC1 SVRSVC1 NAME SVRSVC1 PID Running
SVRSVC2 SVRSVC2 NAME SVRSVC2 PID Running
SVRSVC3 SVRSVC3 NAME SVRSVC3 PID Running
SVRSVC4 SVRSVC4 NAME SVRSVC4 PID Running
SVRSVC5 SVRSVC5 NAME SVRSVC5 PID isn't running
SVRSVC6 SVRSVC6 NAME SVRSVC6 PID Running
SVRSVC7 SVRSVC7 NAME SVRSVC7 PID Running
SVRSVC8 SVRSVC8 NAME SVRSVC8 PID Aborted
SVRSVC9 SVRSVC9 NAME SVRSVC9 PID Running
SVRSVC10 SVRSVC10 NAME SVRSVC10 PID Running
SVRSVC11 SVRSVC11 NAME SVRSVC11 PID Running
SVRSVC12 SVRSVC12 NAME SVRSVC12 PID Stopped
SVRSVC13 SVRSVC13 NAME SVRSVC13 PID Running
SVRSVC14 SVRSVC14 NAME SVRSVC14 PID running
这是我编写的代码,但我想知道这是正确的方法还是最简单的方法。 ?
#set -x
RUNTIME=`date +%Y%m%d_%H%M%S`
TOTAL_RUNSTAT=$(more input.txt | wc -l)
while read -r line; do
if [[ $line =~ Stopped|Aborted|"isn't running" ]]; then
echo $line;
elif [[ $line =~ Running ]]; then
echo $line >> runstatuslog_$RUNTIME;
if [[ `more runstatuslog_$RUNTIME | wc -l` =~ $TOTAL_RUNSTAT ]]; then
echo "ALL SERVICES RUNNING";
fi
fi
done < input.txt
这是预期的输出:
如果发现&#34;已停止|已中止|未运行&#34;打印线。
SVRSVC5 SVRSVC5 NAME SVRSVC5 PID isn't running
SVRSVC8 SVRSVC8 NAME SVRSVC8 PID Aborted
SVRSVC12 SVRSVC12 NAME SVRSVC12 PID Stopped
如果没有找到,请检查是否所有都在运行,打印消息&#34;所有正在运行&#34;
ALL ARE RUNNING.
答案 0 :(得分:1)
不清楚为什么你要测试所有的Nun-Running状态。这将产生您从该输入中要求的输出:
$ awk '{lc=tolower($0)} lc~/isn\047t running$/ || lc!~/running$/{c++;print} END{if (!c) print "ALL ARE RUNNING"}' file
SVRSVC5 SVRSVC5 NAME SVRSVC5 PID isn't running
SVRSVC8 SVRSVC8 NAME SVRSVC8 PID Aborted
SVRSVC12 SVRSVC12 NAME SVRSVC12 PID Stopped
如果那不是您想要的,那么请编辑您的问题以澄清您的要求并提供更具真实代表性的样本输入/输出。
答案 1 :(得分:0)
使用grep
grep -E "Stopped$|Aborted$|isn't running$"
-E
用于扩展正则表达式$
是标记行的结尾|
用于逻辑或使用sed
sed -nE "/Stopped$|Aborted$|isn't running$/p" file
-n
来压制输出/pattern/
仅处理与模式匹配的行p
命令是打印行使用awk
awk '{if($NF != "Running"){i++;print}}
END{if(i == 0){printf "All are running\n"}}' file
这里我们检查最后一个字段$NF
是否为“正在运行”,如果是,则执行默认操作,即打印记录。这与running
中的isn't running
不匹配,因为匹配区分大小写。