>我在文件格式的文件中有部分
**> ### UPDATE `cams`.`product_external_content`
> ### WHERE
> ### @1=330904786 /* INT meta=0 nullable=0 is_null=0 */
> ### @2=124754078 /* INT meta=0 nullable=1 is_null=0 */
> ### @3='main' /* VARSTRING(135) meta=135 nullable=0 is_null=0 */
> ### @4='imgs/a/b/c/sdtv/1028860-26.jpg' /* VARSTRING(900) meta=900 nullable=0 is_null=0 */
> ### @5='main' /* VARSTRING(135) meta=135 nullable=1 is_null=0 */
> --
> --
> ### @10='2019-06-17 15:27:03' /* DATETIME(0) meta=0 nullable=1 is_null=0 */
> ### SET
> ### @1=330904786 /* INT meta=0 nullable=0 is_null=0 */
> ### @2=124754078 /* INT meta=0 nullable=1 is_null=0 */
> ### @3='main' /* VARSTRING(135) meta=135 nullable=0 is_null=0 */
> ### @4='imgs/a/b/c/sdtv/SDL999436767-26.jpg' /* VARSTRING(900) meta=900 nullable=0 is_null=0 */
> ### @5='main' /* VARSTRING(135) meta=135 nullable=1 is_null=0 */**
我想通过 @2=(id( 进行 grep 并获取相应的 @1= 和 @4= 数据。我该怎么做?
我已经尝试了 grep '@2=124754078' bin.sql -C 3 来获取它之前和之后的行,但不知道如何进一步过滤行。
我想要问题中示例的输出,例如@2=139358291 @1=330903701 @4=imgs/a/b/c/sdtv/SDL018872305-26.jpg
$ awk -F"['= ]+" '
{ val = $3 "=" $4 }
/@1=/ { f1 = val }
/@2=/ { f2 = ($4=="124754078" ? val : "") }
/@4=/ && (f2!="") { print f1 ORS f2 ORS val ORS }
' file
@1=330904786
@2=124754078
@4=imgs/a/b/c/sdtv/1028860-26.jpg
@1=330904786
@2=124754078
@4=imgs/a/b/c/sdtv/SDL999436767-26.jpg
我使用的另一个解决方案是这个
for word in $(cat file.txt); do grep 'product_external_content' -A5 bin.sql | grep -A3 -B1 "@2=${word}" |grep "@1|@4" |awk -F '=' '{print $2}'|awk '{print $1}'; done > data.txt