使用 awk 在字符串中查找值

Find values in string using awk

我是 shell 脚本的新手。如果它与另一个字符串匹配,我正在尝试从字符串中选择所有字段值。例如我有一个字符串

Mobile:25:15000#TV:10:20000#Laptop:20:65000

另一个字符串是 TV 然后我的代码应该从 TV:10:20000 中选择数据 如果另一个字符串是 Mobile 那么它应该选择 Mobile:25:15000.

到目前为止我写的代码如下:

#!/bin/bash
x="Mobile:25:15000#TV:10:20000#Laptop:20:65000"
y="Laptop"
o_str=$(echo "$x"| awk -F "#" 'BEGIN{OFS="\n"} {if (== $y) print } y=$y');
echo $o_str

我知道我做错了什么,但无法弄清楚。谁能告诉我哪里错了?

您可以使用

o_str=$(awk -v y="$y" -F: 'BEGIN{RS="#"}  == y' <<< "$x");

online demo:

#!/bin/bash
x="Mobile:25:15000#TV:10:20000#Laptop:20:65000"
y="Laptop"
o_str=$(awk -v y="$y" -F: 'BEGIN{RS="#"}  == y' <<< "$x");
echo "$o_str"
## => Laptop:20:65000

详情:

  • -v y="$y" - 将 tje y 变量传递给 awk 脚本
  • -F: - 字段分隔符设置为 : char
  • BEGIN{RS="#"} - 记录分隔符设置为 # 字符
  • == y - 如果字段 1 的值等于 y 变量值,则打印此记录。

使用您显示的示例,请尝试以下 awk 代码。简单的解释是,创建一个名为 varawk 变量,其中包含 bash 变量 y 的值。在使用 match 的主程序中,其中包含正则表达式 var":[^:]*:[^#]*,匹配变量值将查找 2 个冒号值,直到找到 #,然后打印匹配值。

y="Laptop"
o_str=$(awk -v var="$y" 'match([=10=],var":[^:]*:[^#]*"){print substr([=10=],RSTART,RLENGTH)}' Input_file)

当我们打印变量时输出如下:

echo "$o_str"
Laptop:20:65000

bash 解决方案怎么样:

#!/bin/bash

x="Mobile:25:15000#TV:10:20000#Laptop:20:65000"
y="Laptop"
IFS=# read -r -a ary <<< "$x"           # split $x on "#" into array "ary"
for i in "${ary[@]}"; do                # loop over the elements of ary
    if [[ $i = $y* ]]; then             # if $y starts with an element
        echo "$i"                       # then print the element
    fi
done

输出:

Laptop:20:65000