Sed发现自己并抛弃脚本结果

时间:2016-03-08 20:23:27

标签: bash sed grep

剧本:

#!/bin/bash

SERVICE="$1"
RESULT=`ps -a | sed -n /${SERVICE}/p`
MEM=$(ps aux | sort -rk +4 | grep $1 | grep -v grep | awk '{print      $4}' | awk 'NR == 1')

if [ "${RESULT:-null}" = null ]; then
echo "$1 is NOT running"
else
echo "$MEM"
fi

if [ "$MEM" -ge 1 ]; then
mailx -s "Alert: server needs to be checked"    me@admins.com
fi

ps输出管道传输到sed的问题是即使没有进程正在运行它也会发现自己:

ps aux | sed -n /nfdump/p
root      30724  0.0  0.0 105252   884 pts/1    S+   14:16   0:00 sed -n /process/p

他们的脚本绕过了预期的结果"服务没有运行"并直接回复$ MEM,在这种情况下将为0.0。 sed是否有一个grep -v grep等效的方法可以让自己脱离困境?

2 个答案:

答案 0 :(得分:1)

除了上面的评论之外,让我再添加一个例子。 Sed确实相当于grep -v:你可以用/RE/!否定匹配(将!附加到正则表达式),这样你就可以尝试:

ps aux | sed -n '/sed/!{ /nfdump/ p;}'

此处{ ... }内的部分仅适用于与<{1}}匹配的 行。

对于记录:有一个命令sed可以替换 ps sed管道,请参阅pgrep in Wikipedia或其联机帮助页。

答案 1 :(得分:1)

尝试:

ps aux | sed -n '/[n]fdump/p'

或:

ps aux | grep '[n]fdump'

在进程列表

中找不到正则表达式