【问题标题】:Brackets [ ] around string with grep and ps - ef括号 [ ] 用 grep 和 ps 围绕字符串 - ef
【发布时间】:2018-05-21 23:12:02
【问题描述】:

我正在尝试获取进程开始的时间。 通常我在我正在运行的进程的第一个字母上使用方括号。 它消除了 ps 输出中的自我报告“grep”。

#!/bin/bash

set -x
restarTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS"
bounceTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STP_PS; sleep 10 ; sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS"
timeofTXG=$(ps -ef | grep [t]xg | awk '{print $5}' )

if [ -n "$timeofTXG" ] ; then
    printf "%s\n" "The TXG_DR is ON as of $timeofTXG"
else
    printf "%s\n" "'The TXG_DR is OFF"
fi 

18:40 是我运行检查脚本的时间。 17:44 是进程开始的时间。

++ ps -ef
++ grep '[t]xg'
++ awk '{print $5}'
+ timeofTXG='17:44
18:40
18:40'
+ '[' -n '17:44
18:40
18:40' ']'
+ printf '%s\n' 'The TXG_DR is ON as of 17:44
18:40
18:40'
The TXG_DR is ON as of 17:44
18:40
18:40

我真的不知道方括号是如何工作的。当我从命令行运行 ps 时,[] 括号确实有效—— ps -ef | grep [t]xg | awk '{打印 $5}' 但是在 bash 脚本的上下文中,它们不起作用,它们给了我自我报告 grep 的时间。 括号是如何工作的?为什么它们在命令行而不是在脚本中工作?如何摆脱 bash 脚本中的自我揭示 grep ?

【问题讨论】:

  • 如果当前目录中有任何同名的文件,您需要使用引号来防止 [t]xg 被 shell 替换为 txg。也就是说,代码应该是'[t]xg'
  • ...或者,最好不要使用 grep ps,而是使用专用工具,例如 pgrep
  • 或者,甚至更好的是,甚至不要查看进程表,而是编写您的软件以使用咨询锁定或操作系统提供的进程监督系统(systemd、 runit、daemontools、upstart、launchd,不管它是什么)。
  • 方括号是Grep Regex。您应该谨慎使用您并不真正了解的工具。每当你看到某件事“仅仅因为它起作用”时,你通常应该尝试找出它为什么起作用,因为只要情况发生一点变化,就很难适应你不知道它是如何起作用的东西。你的新情况。
  • @Davy 是的 - 我正在努力理解这些工具。

标签: bash grep brackets ps


【解决方案1】:

如果您已经在运行awk,则不需要grep,请执行以下操作(我猜这是您的意图):

ps -ef | awk '$8 ~ /txg/ {print $5}'

【讨论】:

  • 我完全不相信ps -ef 的输出定义足够明确,可以保证您想要的列(带有可执行文件名称)在所有列中都是$8相关平台。是的,-f 被 POSIX 保证提供一个“完整列表”,它保证一组特定的字段,但是每个字段的内容——以及 awk 是否会将其解析为一个字段或多个字段—— - 是实现定义的。
  • @CharlesDuffy 非常正确,但是,其目的是表明如果您的管道中有awk,您可能不需要grep,而且它肯定比整行更受限制.
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2020-09-15
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多