我在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"
谢谢 灰
答案 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列。 printf
和print
都用于处理最后一个逗号。
答案 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
。read
将myout
值的用空格分隔的部分放入数组parts
中。 -d ''
导致read
继续换行(否则它将在读取第一行后停止)。-r
选项禁用输入中反斜杠的怪异处理(在这里不重要,但始终 始终将-r
与read
一起使用是最安全的,Shellcheck会在丢失时发出警告)。numlist=${parts[*]: -16}
将numlist
字符串设置为parts
数组的最后16个元素,并由$IFS
的第一个字符(默认为空格字符)分隔。 result=${numlist// /,}
将result
设置为numlist
的值,所有空格字符都用逗号替换。