使用 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");
#!/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
代码。简单的解释是,创建一个名为 var
的 awk
变量,其中包含 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
我是 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");
#!/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"
- 将 tjey
变量传递给awk
脚本-F:
- 字段分隔符设置为:
charBEGIN{RS="#"}
- 记录分隔符设置为#
字符== y
- 如果字段 1 的值等于y
变量值,则打印此记录。
使用您显示的示例,请尝试以下 awk
代码。简单的解释是,创建一个名为 var
的 awk
变量,其中包含 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