从unix

时间:2017-08-10 04:39:21

标签: shell unix split extract

考虑我有一个字符串,我需要提取特定的键值。

示例字符串:17=TEST,90=BALANCE,45=SALARY,23=ULIP,20=PLAN,33=CREDIT,11=555

如果我想从上面的字符串中单独获得 45 20 的值,我该如何获得它?一种方法是基于(逗号)进行拆分并将其作为数组进行分割,然后搜索密钥,如果匹配则再次根据“=”进行拆分。

但是有没有简单的命令来执行此任务?提前谢谢..

2 个答案:

答案 0 :(得分:2)

POSIX

让我们定义你的字符串:

$ s='17=TEST,90=BALANCE,45=SALARY,23=ULIP,20=PLAN,33=CREDIT,11=555'

现在,让我们提取45

的值
$ echo "$s" | awk -F= '$1==45{print $2}' RS=,
SALARY

对于20

$ echo "$s" | awk -F= '$1==20{print $2}' RS=,
PLAN

这可以使用awk,其中,作为记录分隔符,=作为字段分隔符。我们选择第一个字段是我们想要的值的记录,在本例中为45或20,然后打印第二个字段。

相反地搜索:

$ echo "$s" | awk -F= '$2=="SALARY"{print $1}' RS=,
45

的bash

如果我们使用bash,那么我们可以使用here-string而不是管道:

$ awk -F= '$1==20{print $2}' RS=, <<<"$s"
PLAN

或者:

$ awk -F= '$2=="PLAN"{print $1}' RS=, <<<"$s"
20

答案 1 :(得分:1)

这是实现目标的sed方法,

$ s="17=TEST,90=BALANCE,45=SALARY,23=ULIP,20=PLAN,33=CREDIT,11=555"
$ sed -E 's/.*,45=([A-Z]+),.*/\1/g' <<< "$s"
SALARY

$ sed -E 's/.*,20=([A-Z]+),.*/\1/g' <<< "$s"
PLAN

grep解决方案,

$ grep -oP '45=\K\w+' <<< "$s"
SALARY
$ grep -oP '20=\K\w+' <<< "$s"
PLAN