我已经完成了一些条件,但无法使用精确的语法来检查文件中的 3 个以上条件。
我可以从文件中执行多个 grep,但无法添加带条件的 3 个模式。像下面这样。
您可以提供 CASE/Loop/if-else(梯形语法。我只想在用户运行此脚本时向用户打印用户友好的消息,而不是在startup.log 文件中找到的模式。这些用户友好的消息应该取决于什么模式在startup.log中找到
假设当我在startup.log中触发上述命令时发现pid已经存在,那么我想像这样打印echo“DB services已经运行”
pg_ctl -D $PGDATA start > startup.log
if [$? -eq 0]
then
#if db services is stopped priviously, then it will start and grep below msg to user
ls -t postgresql*.log | head -n1 | args grep "Database for read only connections"
else
elif grep 'word1\|word2\|word3' startup.log
then
#if above word1 exists in file it should print below msg
echo "hello"
else
#if word2 is present in file it shhould print below msg
echo " world"
# and one more contion i want to add like below
#if word3 is exists in the file it should below msg
echo "postgresql"
如果您可以提供 1 个简单的示例,我真的很感激,因为我已经尝试过语法但无法解决问题。
答案1
根据您对问题的描述,如果在文件中发现不同的模式,您想要执行不同的操作。这需要不同的检查:
if grep -q word1 startup.log; then
echo "Message 1"
elif grep -q word2 startup.log; then
echo "Message 2"
elif grep -q word3 startup.log; then
echo "Message 3"
else
echo "Message 4"
fi
grep -q
默默地检查文件是否匹配。对于每个匹配的模式,您可以添加要显示的相应消息。
请注意,上述逻辑只会显示一条消息。如果文件中存在多个模式,则 if-elif 链中较早指定的模式优先。
如果您想独立检查每个模式,可以使用单独的if
块:
if grep -q word1 startup.log; then
echo "Message 1"
fi
if grep -q word2 startup.log; then
echo "Message 2"
fi
答案2
您没有说明如果在文件中找到多个模式,或者找到某个模式的多个实例,您想要做什么。以下 shell 代码已编写为循环,以处理其中的任何/全部(如果找到)。
for word in $(grep -oE "word1|word2|word3" startup.log ); do
case "$word" in
word1) echo "hello" ;;
word2) echo "world" ;;
word3) echo "postgresql" ;;
esac
done
grep 选项:
-E
使用扩展正则表达式(所以我可以使用word1|word2
代替word1\|word2
)-o
输出仅有的该行的匹配部分(即,word1、word2 或 word3),而不是整行