我如何使用bash脚本在后台执行grep chain命令

时间:2016-11-30 14:28:35

标签: linux bash scripting

我每天都有24小时日志的数据。 greying所需的字符串数据非常庞大,所有24小时目录中搜索字符串需要3个小时。 减少消耗时间我决定将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序列执行,

1 个答案:

答案 0 :(得分:1)

你错误地设计了你的并行调用,并将并行的代码与主脚本中的调用混合在一起。您可以尝试以下方法:

#!/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,在使用并行计算时也要注意同一文件中的concurent写入。