2016-11-30 216 views
0

我有一个每天24小时日志的数据。数据是非常大的grep所需的字符串,需要3小时在所有24小时的目录搜索字符串。 使用&如何在后台使用bash脚本执行grep链命令

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 

这里的问题减少了耗时,我决定将24小时到三个部分分开,并希望在后台执行平行每一部分未正常工作expected.its不运行后台并且不更新日志文件,进一步处理出来的脚本。

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序列,

+0

如果你展示了你的输入数据看起来像什么样的输出,你可能会得到一个很好的答案...... –

+0

点击你的问题下的“编辑”,并在那里更新...不在*评论*区。 –

+0

和你的输入数据? –

回答

1

您错误地设计你的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 
  • (...)意味着我们在子shell执行我们的指令。像变量声明或cd这样的变化在这种情况下是有效的,但不影响我们的主要脚本环境。
    • 我们把需要在这个子shell中平行的完整操作。我们需要在这方面提供所有相关信息。
    • 我们将整个子壳对齐。

关于脚本的几个注意事项:我取下一个useless use of cat,使用paralell计算时也提防在同一文件concurent writtings的。

+0

感谢您获取清晰的信息和步骤,在上面的代码中进行了一些更改之后,我甚至可以获得预期的结果虽然在运行时(set -x)它看起来没有在序列中执行,但是我得到了我的结果 –

+1

是的,在使用paralelisation时很难施加严格的执行顺序(你必须使用更高级的东西,比如信号灯和'wait')。但是,对于每个衍生线程,子shell中的所有内容都应该按照该顺序执行。 – Aserre