如何使用sed或awk在方括号[]之后获取多个数字字符串

时间:2019-03-07 10:48:25

标签: awk sed

我有一个2k数据的文件,我想只获取updr / udrl / imgr / imgl字段的数字值为41110.00 120 996.00 523,并在其中存在updr / updl / imgr / imgl字段的位置将制表符分隔开。

我尝试过用单个模式替换直到方括号,但是之后无法应用另一个模式来获取数字。

echo `sed -n 's/^\[.*][^0-9]*[[:space:]]* //p' client_stat.txt > client_stat_onlyData.csv` ; echo `sed -i 's/ /\t/g' client_stat_onlyData.csv`

我将得到如下所示的o / p,但是我不想打印udpr / updl / imgr / imgl字符串,我只想打印数字值。

updr    48358.00        updl    120     imgr    1015.00 imgl    523
updr    48562.00        updl    120     imgr    1169.00 imgl    523
updr    48305.00        updl    121     imgr    1210.00 imgl    523
updr    48285.00        updl    121     imgr    1135.00 imgl    523
updr    48459.00        updl    121     imgr    1210.00 imgl    523
updr    48246.00        updl    120     imgr    881.00  imgl    523
updr    48439.00        updl    120     imgr    1109.00 imgl    523

连接数= 1 创建RSSL连接主机:192.168.120.1端口:14002 UPA服务器组件版本:ads3.2.2.L1.linux.tis.rrg 64位 设置rmds连接0x10a8900 连接列表数为1 支持待机:0 SupportBatchRequests初始开放时间:是 重新发出SupportBatchRequests:是 支持批量关闭:是 SupportViewRequests:是 SupportOptimizedPauseResume:0

[Tue Feb 19 14:42:50.415] updr 41110.00 updl 120 imgr 996.00 imgl 523
    [Tue Feb 19 14:42:51.415] updr 49368.00 updl 121 imgr 845.00 imgl 523

Status Received <388> Status Text: Stale Status for Item REC1000017 Text: F7: Item Preempted
[Tue Feb 19 14:42:52.415] updr 48542.00 updl 121 imgr 1170.00 imgl 523

Status Received <1166> Status Text: Stale Status for Item REC1000410 Text: F7: Item Preempted
[Tue Feb 19 14:42:53.415] updr 47942.00 updl 120 imgr 1133.00 imgl 523

Status Received <1133> Status Text: Stale Status for Item REC1001609 Text: F7: Item Preempted
[Tue Feb 19 14:42:54.415] updr 48513.00 updl 120 imgr 1100.00 imgl 523

2 个答案:

答案 0 :(得分:0)

请尝试以下操作(它将在提及的OP旁边显示字符串旁边的数字)。

awk '{for(i=1;i<=NF;i++){if($i ~ /^(updr|udrl|imgr|imgl)$/){val=val?val OFS $(i+1):$(i+1)}};print val;val=""}'  Input_file

或添加非单一衬里形式的解决方案。

awk '
{
  for(i=1;i<=NF;i++){
    if($i ~ /^(updr|udrl|imgr|imgl)$/){
       val=val?val OFS $(i+1):$(i+1)
    }
  }
  print val
  val=""
}
'   Input_file

如果要将输出保存到Input_fie本身,请在上面的代码中附加> temp_file && mv temp_file Input_file。同样,如果您的Input_file是用TAB分隔的,而您想以TAB分隔的格式输出,则将awk的代码从awk 'BEGIN{FS="OFS="\t"}更改为{for....,如上所述。

说明: 添加上述代码的说明。

awk '                                        ##Starting awk program here.
{                                            ##Startig conditions BLOCK here.
  for(i=1;i<=NF;i++){                        ##Starting a for lop here from variable i value 1 to till value of NF, where NF is awk OOTB variable and have value of number of fields in current line.
    if($i ~ /^(updr|udrl|imgr|imgl)$/){      ##Checking condition if current field value is startig with strings either updr OR udrl OR imgr OR imgl and ends with any of these then do following.
       val=(val?val OFS $(i+1):$(i+1))       ##Creating variable val whose value is keep concatenating its own previous value here.
    }                                        ##Closing BLOCK for if condition here.
  }                                          ##Closing BLOCK for for loop here.
  print val                                  ##Printing value of variable val here.
  val=""                                     ##Nullifying variable val value here.
}                                            ##Closing main BLOCK now.
'  Input_file                                ##Mentioning Input_file name here.

编辑: 代码运行示例。

awk '{for(i=1;i<=NF;i++){if($i ~ /^(updr|udrl|imgr|imgl)$/){val=val?val OFS $(i+1):$(i+1)}};print val;val=""}'  Input_file
48358.00 1015.00 523
48562.00 1169.00 523
48305.00 1210.00 523
48285.00 1135.00 523
48459.00 1210.00 523
48246.00 881.00 523
48439.00 1109.00 523

答案 1 :(得分:0)

使用Perl单线版

 perl -ne ' while( /(updr|udrl|imgr|imgl)\s+(\S+)/g ) { print "$2 " } print "\n" '  file

使用您给定的输入

$ cat vijaya.txt
updr    48358.00        updl    120     imgr    1015.00 imgl    523
updr    48562.00        updl    120     imgr    1169.00 imgl    523
updr    48305.00        updl    121     imgr    1210.00 imgl    523
updr    48285.00        updl    121     imgr    1135.00 imgl    523
updr    48459.00        updl    121     imgr    1210.00 imgl    523
updr    48246.00        updl    120     imgr    881.00  imgl    523
updr    48439.00        updl    120     imgr    1109.00 imgl    523

$ perl -ne ' while( /(updr|udrl|imgr|imgl)\s+(\S+)/g ) { print "$2 " } print "\n" ' vijaya.txt
48358.00 1015.00 523
48562.00 1169.00 523
48305.00 1210.00 523
48285.00 1135.00 523
48459.00 1210.00 523
48246.00 881.00 523
48439.00 1109.00 523

$