如何从字符串中提取数字并将其作为逗号分隔的值进行转储?

时间:2019-05-30 14:57:46

标签: bash

我在bash中有一个test_file,它在屏幕上输出以下内容。我无法控制上游代码以某种方式打印它们。因此,我需要从屏幕输出中解析一些值。 这是我在做什么:

MyOut=$(./my_test_file.sh)    # this is my example script which echo's the 
                                 #output
echo $MyOut    

显示以下内容

output for different segments IP address: 192.168.0.12 Segment :0xfff Segment Data: 123 23 42 23 4 444 1121 8676 34 530 323 564 523 7878 7328 96

我的预期结果将是一个字符串变量

123,23,42,23,4,444,1121,8676,34,530,323,564,523,7878,7328,96

以逗号分隔的16个值存储在某个变量中,我可以将其转储到文本文件中以进行进一步处理。

我尝试使用正则表达式,只想在以下输出中提取最后16个数字

我做到了

numbers=$(echo $MyOut | grep -o -E '[0-9]+')

给我

192 168 0 12 0 123 23 42 23 4 444 1121 8676 34 530 323 564 523 7878 7328 96

我需要提取最后16个数字。由于它不是数组格式,我可以在正则表达式中添加一些仅以逗号分隔的最后16个数字吗?

btw如果需要查看my_test_file.sh,它只是回显语句

#!/bin/bash

echo "output for different segments "
echo "IP address: 192.168.0.12 Segment :0xfff"                        
echo "Segment Data:"                                                                 
echo "123"                                                                            
echo "23"                                                                          
echo "42"                                                                           
echo "23"                                                                           
echo "4"                                                                           
echo "444"                                                                           
echo "1121"                                                                           
echo "8676"                                                                           
echo "34"                                                                           
echo "530"                                                                           
echo "323"                                                                           
echo "564"                                                                           
echo "523"                                                                            
echo "7878"                                                                            
echo "7328"                                                                            
echo "96"

谢谢 灰

5 个答案:

答案 0 :(得分:1)

MyOut=$(./my_test_file.sh | tail -n +4 | paste -sd ",")

tail -n +4将跳到输出的第四行,而paste将使用逗号而不是空格将这些行连接起来。

在您提到的评论中,您无权访问paste-tr呢?

MyOut=$(./my_test_file.sh | tail -n +4 | tr '\n' ',')

答案 1 :(得分:0)

这是一个示例awk脚本:

 text="output for different segments IP address: 192.168.0.12 Segment :0xfff Segment Data: 123 23 42 23 4 444 1121 8676 34 530 323 564 523 7878 7328 96"
 echo $text |awk '{sub(/^.*Segment Data: /,"");gsub(/ /,",")}1' 

输出:

123,23,42,23,4,444,1121,8676,34,530,323,564,523,7878,7328,96

外植:

sub(/^.*Segment Data: /,"")Segment Data:开头的行中删除文本

gsub(/ /,",")替换所有,

1打印修改行

答案 2 :(得分:0)

其他方式:

echo "output for different segments IP address: 192.168.0.12 Segment :0xfff Segment Data: 123 23 42 23 4 444 1121 8676 34 530 323 564 523 7878 7328 96" | awk -F'Segment Data: ' '{print $2}' | sed 's/ /,/g'

给您

123,23,42,23,4,444,1121,8676,34,530,323,564,523,7878,7328,96

答案 3 :(得分:0)

仅使用awk

./my_test_file.sh |awk -vlast=16 -v RS=    '{gsub(/[^[:digit:]]/," ") ; for(i=NF-last+1;i<=NF;i++) if(i!=NF)printf $i",";else print $i}'
123,23,42,23,4,444,1121,8676,34,530,323,564,523,7878,7328,96

首先使用gsub()函数从每一行中删除所有非数字字符,然后循环到最后16列。 printfprint都用于处理最后一个逗号。

答案 4 :(得分:0)

尝试使用这种Shellcheck干净的纯Bash代码:

#! /bin/bash -p

myout=$(./my_test_file.sh)
read -r -d '' -a parts <<<"$myout"
numlist=${parts[*]: -16}
result=${numlist// /,}

printf '%s\n' "$result"
  • 使用问题中给出的my_test_file.sh打印123,23,42,23,4,444,1121,8676,34,530,323,564,523,7878,7328,96
  • 代码假定IFS为默认值。
  • readmyout值的用空格分隔的部分放入数组parts中。 -d ''导致read继续换行(否则它将在读取第一行后停止)。-r选项禁用输入中反斜杠的怪异处理(在这里不重要,但始终 始终将-rread一起使用是最安全的,Shellcheck会在丢失时发出警告)。
  • numlist=${parts[*]: -16}numlist字符串设置为parts数组的最后16个元素,并由$IFS的第一个字符(默认为空格字符)分隔。
  • result=${numlist// /,}result设置为numlist的值,所有空格字符都用逗号替换。