如何检测多行输出中的字符串,并在bash脚本中的一行中基于子字符串设置变量?

时间:2018-01-27 23:19:54

标签: bash scripting grep

我在bash中的脚本知识是非常基础的,我在过去拼凑了一些东西来完成我多年来需要的自动化。

最新项目是关于一些视频处理,并根据文件的格式,我想做一些后期处理。

ffprobe将输出有关视频文件的元数据,摘录如下:

ISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=eng
[/STREAM]
[STREAM]
index=1
codec_name=dts
codec_long_name=DCA (DTS Coherent Acoustics)
profile=DTS
codec_type=audio
codec_time_base=1/48000
codec_tag_string=[0][0][0][0]

特别是,我想检测字符串codec_name=dts是否存在,然后获取前一行中表示的索引值。在上面的情况中,它确实包含codec_name=dts,我希望以后能够在脚本中使用值1,因为它前面的行index=1

在我的脚本中,我使用这个逻辑使用grep:

进行第一次字符串检测
if (/usr/sbin/ffprobe -show_streams -i "$source"  | grep -q "codec_name=dts"); then
    <do some work here>
fi

做我想完成的事情的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

我建议:

| awk -F "=" '$1=="index"{i=$2}; /codec_name=dts/{print i}'

答案 1 :(得分:0)

使用grep,您可以检查输出中index=?后面是否code_name=dts。如下所示:

#!/bin/bash

/usr/sbin/ffprobe -show_streams -i "$source" > metadatafile.txt
val=$(grep -B1 'codec_name=dts' metadatafile.txt  | grep -o -P '(?<=index=)[0-9]+$') 

# Make sure $val is a number, kinda redundant because above `grep` takes care of that.
if [[ $val =~ ^[0-9]+$ ]]; then
    echo "Doing some work here with $val"
fi