linux - grep后如何过滤部分行

标签 linux sed grep

我的文件中有以下格式的部分

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

关于linux - grep后如何过滤部分行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56654971/

相关文章:

linux - 在不使用双引号的情况下搜索包含当前日期的日志文件

linux - udev规则匹配雷凌wifi卡加载rt2800usb

linux - 开发 Web 服务器上的基本颠覆服务器问题

linux - 在unix中为两个字段添加双引号

bash - 使用 sed 或 awk 删除每行特定索引内容以外的所有内容

linux - grep 键值对和格式的值

c++ - Linux 中用于 C++ 的 Sublime Build 系统允许从文件输入

linux - USB串口驱动(通讯协议(protocol))

linux - 替换连续的 2 个模式

sed - grep + grep + sed = sed : no input files