【问题标题】:apachectl - doubts regular expressionapachectl - 怀疑正则表达式
【发布时间】:2019-12-05 11:49:27
【问题描述】:

如何获取apachectl status 命令的状态?

例如,在下面的输出中,我只想取单词“running”

Active: active (running) since Thu 2019-12-05 08:23:56 -03; 22min ago

我设法通过命令获得了正常运行时间:

apachectl status | sed -n '/ ago $ / p' | sed 's /. \ {62 \} //'

但是,我无法调整此命令来获取状态。

【问题讨论】:

  • apachectl status | sed -n 's/.*(\(.*\)).*/\1/p'
  • 我为您的正则表达式问题添加了sed 解决方案的答案,无需了解特定应用程序的工作原理。

标签: linux apache awk sed systemctl


【解决方案1】:

使用echo '...' 而不是我没有的apachectl status

$ echo 'Active: active (running) since Thu 2019-12-05 08:23:56 -03; 22min ago' |
    awk -F'[()]' '{print $2}'
running

您问题中的 sed 命令管道存在语法错误,当我尝试修复它们时,我只得到输出 min ago:

$ echo 'Active: active (running) since Thu 2019-12-05 08:23:56 -03; 22min ago' |
    sed -n '/ago$/p' | sed 's/.\{62\}//'
min ago

如果这是您想要的输出,请考虑:

$ echo 'Active: active (running) since Thu 2019-12-05 08:23:56 -03; 22min ago' |
    awk -F'; ' '{print $NF}'
22min ago

我也有鸡。

【讨论】:

    【解决方案2】:

    您实际上应该以这种方式执行此操作。 is-active是获取systemctl服务状态的准确命令。

    [[ $(sudo systemctl is-active test.service) == "active" ]] && echo "Running." || echo "NOT runnnig."
    

    或者更清楚:

    [[ $(sudo systemctl is-active test.service) == "active" ]]\
    && echo "Running." || echo "NOT runnnig."
    

    或者根据 Ed sir 的评论,更安全的选项将使用通常的 ifelse 选项,如下所示。

    if [[ $(sudo systemctl is-active test.service) == "active" ]]
    then
        echo "Running."
    else
        echo "NOT runnnig."
    fi
    

    来自 systemctl 的手册页:

    is-active PATTERN... 检查是否有任何指定的单位 活动(即运行)。如果至少有一个,则返回退出代码 0 活动,否则非零。除非指定 --quiet ,否则这将 还将当前单元状态打印到标准输出。

    【讨论】:

    • 小心test && do_a || do_b - 这不是一个看起来像的三元结构,|| 正在测试执行的最后一个命令失败,所以如果test 导致fail 那么该代码将按预期执行do_b,而如果test 导致success,则do_a 将被执行,但如果失败,则do_b 也将被执行,这可能不是你所期望的 - 你可以有sudo... == active真实并且仍然输出NOT running!显然,echo "Running" 在这种情况下不太可能失败,这只是一个普遍的提醒,这不是一种安全的做法。
    • @EdMorton,感谢 TON 先生告诉我,我现在也在我的解决方案中添加了一个常用的 if else 方法,干杯。
    【解决方案3】:

    如果apachectl status 产生Active: active (running) since Thu 2019-12-05 08:23:56 -03; 22min ago 你的问题 - 得到第一个括号之间的字符串 - 可以解决

    apachectl status | sed -n 's/[^(]*(\([^()]*\)).*/\1/p'`
    

    Proof:

    echo "Active: active (running) since Thu 2019-12-05 08:23:56 -03; 22min ago" | sed -n 's/[^(]*(\([^()]*\)).*/\1/p'
    # => running
    

    模式匹配:

    [^(]*      - from start till first (
    (          - ( char
    \([^()]*\) - a capturing group matching substring inside parentheses
    )          - ) char
    .*         - up to the string end
    

    -n ... p 打印结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多