在Ubuntu上,BASH脚本在一些处理之后挂起

分享于 

4分钟阅读

ubuntu

  繁體 雙語

问题:

我在一个红帽服务器上运行了以下脚本,它可以正常工作并完成任务。 我提供的文件包含了half行,这就是为什么我在循环块的末尾添加了一个'&'

但是现在我已经安装了一个带有 8内存的桌面,上面运行了 Ubuntu,运行相同的代码只完成了几千行代码,然后挂起了。 我读了一点,并且增加了堆栈限制,并且仍然挂起了 80000行。


while read -r CID60


do 


 { 


 OLT=$(echo"$CID60" | cut -d"|" -f5) 


 ONID=${OLT}:$(echo"$CID60" | cut -d, -f2 | sed 's///g ; s/).*|//') 


 echo $ONID,$(echo"$CID60" | cut -d"|" -f3)>> $localpath/CID_$logfile.csv 


 } & 


done <$localpath/$CID7360



输入:


202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ASSN45| Unlocked|12-654-0330|Up|202-00_MSRFKH00OL6|P282018767.C2028 ( network, R1.S1.LT7.PON8.ONT81.SERV1 )|



202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ASSN46| Unlocked|12-654-0330|Down|202-00_MSRFKH00OL6|P282017856.C881 ( local, R1.S1.LT7.PON8.ONT81.C1.P1 )|



202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ASSN52| Unlocked|12-664-1186|Up|202-00_MSRFKH00OL6|P282012623.C2028 ( network, R1.S1.LT7.PON8.ONT75.SERV1 )|



输出:


202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT81.SERV1,12-654-0330



202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT81.C1.P1,12-654-0330



202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT75.SERV1,12-664-1186



我感兴趣的输出是 5th 列( 用管道 | 分隔) 与最后一列的一部分连接,然后是第三列


回答 1:

Perl解决方案

这里脚本不会并行执行任何操作,但它的速度很快。 将它保存为 filter.pl ( 或者你喜欢什么 NAME ) 并使它的可以执行。


#!/usr/bin/env perl



use strict;


use warnings;



while( <> ) {


 if (/^(?:[^|]+|){2}([^|]+)|[^|]+|([^|]+)|[^,]+,s*(S+)/) {


 print"$2:$3,$1n";


 }


}



我复制了样本数据,直到获得 1,572,864行,然后按如下方式运行:


me@ubuntu:~> time./filter.pl <input.txt> output.txt


real 0m3,603s


user 0m3,487s


sys 0m0,100s



me@ubuntu:~> tail -3 output.txt


202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT81.SERV1,12-654-0330


202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT81.C1.P1,12-654-0330


202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT75.SERV1,12-664-1186



如果你喜欢一个衬垫,请执行以下操作:


perl -lne 'print"$2:$3,$1" if/^(?:[^|]+|){2}([^|]+)|[^|]+|([^|]+)|[^,]+,s*(S+)/;' <input.txt> output.txt




回答 2:

纯sed解决方案:


sed -r 's/^[^|]+|[^|]+|([^|]+)|[^|]+|([^|]+)|.+(. +, ([^ ]+).+/2:3,1/' <in.dat> out.dat





PROC  Ubuntu  BASH  bash-script  HANG