Как отфильтровать часть строк после их поиска - PullRequest
0 голосов
/ 18 июня 2019

У меня есть раздел в файлах формата

**> ### 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 */**

Я хочу выполнить grep по @ 2 = (id) и получить соответствующие данные @ 1 = и @ 4 =.Как я могу это сделать?

Я попытался grep '@ 2 = 124754078' bin.sql -C 3, чтобы получить строки до и после него, но не знаю, как дополнительно фильтровать строки.

Мне нужен вывод для выборки в вопросе, например @ 2 = 139358291 @ 1 = 330903701 @ 4 = imgs / a / b / c / sdtv / SDL018872305-26.jpg

Ответы [ 2 ]

1 голос
/ 18 июня 2019
$ 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
0 голосов
/ 19 июня 2019

Другое решение, которое я использовал, было это

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
...