【问题标题】:Read each line to match a pattern读取每一行以匹配模式
【发布时间】:2016-07-06 01:34:12
【问题描述】:

我在 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

这是预期的输出:

如果发现“已停止|已中止|未运行”,则打印该行。

SVRSVC5 SVRSVC5 NAME    SVRSVC5 PID     isn't running
SVRSVC8 SVRSVC8 NAME    SVRSVC8 PID     Aborted
SVRSVC12 SVRSVC12 NAME  SVRSVC12 PID    Stopped

如果没有找到,检查是否所有都在运行,然后打印消息“ALL ARE RUNNING”

ALL ARE RUNNING.

【问题讨论】:

    标签: if-statement awk while-loop case


    【解决方案1】:

    不清楚为什么要测试所有的修女运行状态。这将产生您从该输入中要求的输出:

    $ 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
    

    如果这不是您想要的,请编辑您的问题以阐明您的要求并提供更具代表性的示例输入/输出。

    【讨论】:

    • 如何使这个大小写不敏感,因为它匹配“运行”
    • 我得到如下输出。我想将“运行|运行”视为相同。 awk '!/Running$/{c++;print} END{if (!c) print "ALL ARE ARE RUNNING"}' input_status3.txt SVRSVC5 SVRSVC5 名称 SVRSVC5 PID 未运行 SVRSVC8 SVRSVC8 名称 SVRSVC8 PID 中止 SVRSVC12 SVRSVC12 名称 SVRSVC12 PID Stopped SVRSVC14 SVRSVC14 NAME SVRSVC14 PID running
    • 是空格。
    【解决方案2】:

    使用 grep

    grep -E "Stopped$|Aborted$|isn't running$"
    
    1. -E 用于扩展正则表达式
    2. $ 是标记行尾
    3. | 用于逻辑或

    使用 sed

    sed -nE "/Stopped$|Aborted$|isn't running$/p" file
    
    1. -n 抑制输出
    2. /pattern/ 是只处理匹配模式的行
    3. p 命令是打印行

    使用 awk

    awk '{if($NF != "Running"){i++;print}}
         END{if(i == 0){printf "All are running\n"}}' file
    

    这里我们检查最后一个字段$NF 是否不是“正在运行”,如果是,则执行默认操作,即打印记录。这将与 isn't running 中的 running 不匹配,因为匹配区分大小写。

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      相关资源
      最近更新 更多