Linux 猛击时非常缓慢

Linux 猛击时非常缓慢,linux,bash,performance,shell,while-loop,Linux,Bash,Performance,Shell,While Loop,我有一个while循环,它读取邮件日志文件并将其放入数组中,这样我就能够在数组中搜索并匹配/搜索流。不幸的是,while循环需要很长时间才能完成文件,它是一个非常大的文件,但必须有另一种更快的方法来完成 cat /home/maillog |grep "Nov 13" |grep "from=<xxxx@xxxx.com>" |awk '{print $6}' > /home/output_1 while read line; do awk -v line="$line"

我有一个while循环,它读取邮件日志文件并将其放入数组中,这样我就能够在数组中搜索并匹配/搜索流。不幸的是,while循环需要很长时间才能完成文件,它是一个非常大的文件,但必须有另一种更快的方法来完成

cat /home/maillog |grep "Nov 13" |grep "from=<xxxx@xxxx.com>" |awk '{print $6}' > /home/output_1 

while read line; do awk -v line="$line" '$6 ~ line { print $0 }' /home/maillog >> /home/output_2 ; done < /home/output_1
cat/home/maillog|grep“11月13日”| grep“from=“|awk'{print$6}”>/home/output_1
读行时;do awk-v line=“$line”'$6~line{print$0}'/home/maillog>>/home/output_2;完成

有什么想法吗?提前感谢。

让我们分析一下您的脚本,并试着解释一下它为什么慢

让我们首先从您的第一行的微观优化开始。这不会加速事情的发展,但这只是教育

cat /home/maillog |grep "Nov 13" |grep "from=<xxxx@xxxx.com>" |awk '{print $6}' > /home/output_1 
  • 多个greps与awk结合使用。。。可以编写为单个awk

    awk '/Nov 13/ && /from=<xxxx@xxxx.com>/ {print $6}'
    

    让我们分析一下你的剧本,并试着解释它为什么慢

    让我们首先从您的第一行的微观优化开始。这不会加速事情的发展,但这只是教育

    cat /home/maillog |grep "Nov 13" |grep "from=<xxxx@xxxx.com>" |awk '{print $6}' > /home/output_1 
    
  • 多个greps与awk结合使用。。。可以编写为单个awk

    awk '/Nov 13/ && /from=<xxxx@xxxx.com>/ {print $6}'
    

    我想你只有用awk才能完成所有的狂欢。awk读取文件的每一行,让您过滤、保存变量等。我最近在一个有20k行的文件中使用了awk,它运行得非常快。这是我的第一个awk脚本,我发现这个网站非常有用。你正在为每行启动一个新的
    awk
    ,速度一定很慢。你真的需要
    /home/output\u 1
    文件吗?避免在两次调用之间使用磁盘有助于提高性能。您读取
    /home/maillog
    的次数太多,每行读取一次
    output\u 1
    ,这就是速度如此之慢的原因。重做一次或两次,你能分享一个输入和输出的例子吗?我认为你只能用awk来制作所有的bash。awk读取文件的每一行,让您过滤、保存变量等。我最近在一个有20k行的文件中使用了awk,它运行得非常快。这是我的第一个awk脚本,我发现这个网站非常有用。你正在为每行启动一个新的
    awk
    ,速度一定很慢。你真的需要
    /home/output\u 1
    文件吗?避免在两次调用之间使用磁盘有助于提高性能。您读取
    /home/maillog
    的次数太多,每行读取一次
    output\u 1
    ,这就是速度如此之慢的原因。修改一下,只看一两遍你能分享一下输入和输出的例子吗?哦,伙计,你真是个天才,谢谢你花时间解释我。它现在运行得很好。哦,伙计,你是个天才,谢谢你花时间解释我。现在很好用。
    while read line; do 
       awk -v line="$line" '$6 ~ line { print $0 }' /home/maillog >> /home/output_2 ;
    done < /home/output_1
    
    awk '(NR==FNR) && /Nov 13/ && /from=<xxxx@xxxx.com>/ {a[$6];next}($6 in a)' /home/maillog /home/maillog > /home/output2