Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何从字符串中提取数字并将其作为逗号分隔的值转储?_Bash - Fatal编程技术网

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

Bash 如何从字符串中提取数字并将其作为逗号分隔的值转储?,bash,Bash,我在bash中有一个test_文件,它在屏幕上输出以下内容。我无法控制上游代码以某种方式打印它们。因此,我需要解析屏幕输出中的一些值。 以下是我正在做的: MyOut=$(./my_test_file.sh) # this is my example script which echo's the #output echo $MyOut 向我展示以下内容 output for different segments

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

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个由逗号分隔的数字吗

顺便说一句,如果你需要查看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"

谢谢
下面是一个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(/^.*段数据:/,“”)
将行开头的文本删除到
段数据:

gsub(//,“,”)
将所有
替换为

1
打印修改的行

MyOut=$(./my_test_file.sh | tail -n +4 | paste -sd ",")
tail-n+4
将跳到输出的第4行,而
粘贴将用逗号而不是空格连接这些行

在您提到的评论中,您无权访问
粘贴
——那么
tr

MyOut=$(./my_test_file.sh | tail -n +4 | tr '\n' ',')
其他方式:

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

仅使用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
/my_test_file.sh | awk-vlast=16-v RS='{gsub(/[^[:digit:]/,“”);for(i=NF last+1;i试试这个-clean pure Bash代码:

#! /bin/bash -p

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

printf '%s\n' "$result"
!/bin/bash-p
myout=$(./my\u test\u file.sh)

阅读-r-d'-a第1部分我想你忘了从你的答案中删除echo或input.txt。2同样,这对OP提供的脚本也不起作用。你可以使用原始脚本进行验证。来自@PSHi Sean的固定评论,感谢你的回复。我不能在shell中使用“粘贴”,因为它被阻止,并且没有权限使粘贴生效.但是,是的,它运行得很好,正如我在定期聚会上所预期的那样environment@AshSDR,更新了我的答案(
tr
而不是
paste