Shell 脚本从文件中搜索多个模式并与模式匹配超过 3 个条件

Shell 脚本从文件中搜索多个模式并与模式匹配超过 3 个条件

我已经完成了一些条件,但无法使用精确的语法来检查文件中的 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),而不是整行

相关内容