loong变量grep输出相同的输入变量

时间:2019-05-10 21:17:26

标签: bash grep

我有一个长变量,当我使用| grep rc

时,我将使用grep搜索

然后输出bash $ crf的同一行

我要搜索rc =将=之后的值设置为变量

crf="cabac=1 / ref=5 / deblock=1:-3:-3 / analyse=0x3:0x113 / me=umh / subme=7 / psy=1 / psy_rd=1.00:0.15 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=16 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=19.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00"
rc=$(echo $crf |grep rc=)

输出与输入$ crf相同

2 个答案:

答案 0 :(得分:0)

您不应使用grep。命令grep将在每一行中搜索匹配项,如果找到,将打印该行。由于您的代码是单行字符串,因此它将始终打印整行。

相反,您可以使用awk除以rc=,然后使用cut仅保留值:

rc=$(awk -F'rc=' '{ print $2 }' <<< $crf | cut -d' ' -f1)

部分说明:

  • awk -F'rc=' '{ print $2 }' <<< $crf用分隔符crf分隔字符串rc=并显示第二个子字符串。该部分将从分配给rc=
  • 的值开始
  • | cut -d' ' -f1会将上面的子字符串按空格()分割,并仅保留第一个元素,即您要查找的值。

答案 1 :(得分:0)

每当我的数据中有标签名=值对时,我发现最好首先创建一个将标签名转换为值的数组(下面的f[]),然后我可以按名称访问值,例如:

$ crf='cabac=1 / ref=5 / deblock=1:-3:-3 / analyse=0x3:0x113 / me=umh / subme=7 / psy=1 / psy_rd=1.00:0.15 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-3 / threads=16 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=24 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=19.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00'

$ echo "$crf" | awk -v tag='rc' -F' / |=' '{for (i=1; i<=NF; i+=2) f[$i]=$(i+1); print f[tag]}'
crf

$ echo "$crf" | awk -v tag='ip_ratio' -F' / |=' '{for (i=1; i<=NF; i+=2) f[$i]=$(i+1); print f[tag]}'
1.40

$ rc=$(echo "$crf" | awk -v tag='rc' -F' / |=' '{for (i=1; i<=NF; i+=2) f[$i]=$(i+1); print f[tag]}')                     $ echo "$rc"
crf