繁体   English   中英

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

[英]how do i execute grep chain command in background using bash script

我每天都有24小时日志的数据。 该数据非常庞大,无法grep所需的字符串,因此需要花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
  • (...)表示我们在子shell中执行指令。 诸如变量声明或cd类的更改在这种情况下有效,但不会影响我们的主脚本环境。
    • 我们将需要并行处理的完整操作放在此子shell中。 我们需要在这种情况下放置所有相关信息。
    • 我们将完整的subshel​​l并置。

关于脚本的一些注意事项:我删除了cat无用用法 ,并且在使用paralell计算时也要注意同一文件中的一致文字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM