从 unix 中的字符串中提取特定的字符串值

extract particular string value from string in unix

假设我有一个字符串,我需要从中提取特定的键值。

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

并考虑如果我想从上面的字符串中单独获取 4520 的值,我该如何获取它?一种方法是基于 ,(逗号)拆分并将其作为数组获取,然后搜索键,如果匹配再次基于“=”拆分。

但是有什么简单的命令可以执行这个任务吗?提前致谢..

POSIX

让我们定义您的字符串:

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

现在,让我们提取 45 的值:

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

对于20

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

这通过使用带有 , 作为记录分隔符和 = 作为字段分隔符的 awk 来实现。我们 select 记录其第一个字段是我们想要的值,在本例中为 45 或 20,然后打印第二个字段。

反向搜索:

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

bash

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

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

或:

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

这是实现您目标的sed方法,

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

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

grep解,

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