如何使用BASH脚本在后台执行GREP链命令



我每天有24小时日志的数据。数据很大,可以抓住所需的字符串,需要3个小时才能在所有24小时DIR中搜索字符串。为了减少我决定将24小时分为三个部分分开的消费时间,并希望使用&

在后台平行执行每个部分
cat test.sh
log1="22 01  02  03  04  05  06  21"
log2="07  08  09  10  11  12  13  22"
log3="14  15  16  17  18  19  20  23"
for me in $log1
do
    for me1 in $me
    do
            cd  $me1
            $(cat * | grep ASS-va1appus06-1480458532238-14424 |  grep -i "am/agent/registered" &) >../log_$me1 &
            cd ..
    done
done

这里的问题无法正常工作。它没有运行背景,也没有更新日志文件,脚本进一步处理。

some of the script output is
+ cd 22
+ cd ..
++ grep ASS-va1appus06-1480458532238-14424
++ grep -i am/agent/registered
++ cat logfile.log1 logfile.log2 .......

如果您看到命令未按照给定的GREP序列执行,则

您错误地设计了paralell调用,并混合代码的paralell位以及主脚本中的调用。您可以尝试以下方法:

#!/bin/bash
log1="22 01  02  03  04  05  06  21"
log2="07  08  09  10  11  12  13  22"
log3="14  15  16  17  18  19  20  23"
for me in $log1
do
    for me1 in $me
    do
            # you could aslo get rid of the cd altogether 
            # (grep "ASS-va1appus06-1480458532238-14424" $me1/* |  grep -i "am/agent/registered" >log_$me1) &
            (cd $me1 && grep "ASS-va1appus06-1480458532238-14424" * |  grep -i "am/agent/registered" >../log_$me1) &
    done
done
  • (...)表示我们在子壳中执行指令。在这种情况下,变量声明或cd之类的变化是有效的,但不会影响我们的主要脚本环境。
    • 我们将需要在此子壳中列入的完整操作。我们需要将所有相关信息放在此上下文中。
    • 我们将完整的子壳纳入。

有关您的脚本的一些注释:我删除了使用Paralell Computing时同一文件中的同一文件的无用使用。

最新更新