从Shell Script变量中提取分隔符之间的数据

时间:2017-01-24 08:16:38

标签: bash shell awk grep

我有这个shell脚本变量, var 。它保留3个以新行分隔的条目。从此变量 var ,我想提取 2 0.078688 。只是这两个数字。

var="USER_ID=2
     # 0.078688
     Suhas"

这些是我试过的代码:

echo "$var" | grep -o -P '(?<=\=).*(?=\n)' # For extracting 2

echo "$var" | awk -v FS="(# |\n)" '{print $2}' # For extracting 0.078688

以上都没有工作。这里有什么问题?如何解决这个问题?

5 个答案:

答案 0 :(得分:5)

只需使用tr来保留数字,点(.)和空格,然后删除其他所有内容。

tr -cd '0-9. ' <<<"$var"
2      0.078688

mantr -c页面-dIFS=' ' read -r var1 var2 < <(tr -cd '0-9. ' <<<"$var") printf "%s\n" "$var1" 2 printf "%s\n" "$var2" 2 0.078688 标志的使用

  

tr [OPTION] ... SET1 [SET2]

     

-c,-C, - 补充                 使用SET1的补充

     

-d, - 删除                 删除SET1中的字符,不要翻译

将其存储在变量

IFS=' ' read -ra numArray < <(tr -cd '0-9. ' <<<"$var")
printf "%s\n" "${numArray[@]}"
2
0.078688

或者在数组中

-cd

注意: - tr中的POSIX标记符合tr标准,适用于安装了public static void main(String[] args) { CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList(); for (int i = 0; i < 10; i++) { list.add(i); } for (Integer num : list) { if (num % 2 == 0) { list.add(num * 100); } } System.out.println("list = " + list); } 的任何系统。

答案 1 :(得分:2)

echo "$var" |grep -oP 'USER_ID=\K.*'
2
echo "$var" |grep -oP '# \K.*'
0.078688

您的解决方案接近完美,您需要偶然\n$代表行尾。

echo "$var"  |awk -F'# ' '/#/{print $2}'
0.078688
echo "$var"  |awk -F'=' '/USER_ID/{print $2}'
2

答案 2 :(得分:1)

你可以使用正则表达式使用纯bash来实现:

#!/bin/bash

var="USER_ID=2
 # 0.078688
 Suhas"

[[ ${var} =~ =([0-9]+).*#[[:space:]]([0-9\.]+) ]] && result1="${BASH_REMATCH[1]}" && result2="${BASH_REMATCH[2]}"
echo "${result1}"
echo "${result2}"

答案 3 :(得分:0)

使用awk:

第一个值:

echo "$var" | grep 'USER_ID' | awk -F "=" '{print $2}'

第二个值:

echo "$var" | grep '#' | awk '{print $2}'

答案 4 :(得分:0)

假设这是作为样本的数据格式

# For extracting 2
echo "$var" | sed -e '/.*=/!d' -e 's///'
echo "$var" | awk -F '=' 'NR==1{ print $2}'

# For extracting 0.078688
echo "$var" | sed -e '/.*#[[:blank:]]*/!d' -e 's///' 
echo "$var" | awk -F '#' 'NR==2{ print $2}'