Grep 一行然后打印 awk 直到某个子串

Grep a line then print awk until a certain substring

我的密码是

var=$(cat $FILE | grep "$alineimlookingfor" | awk '{print , , , , ... all the way to }'
echo "$var" 

但是,我希望在达到 (0) 或 (1) 这样的值时停止 $9-$20。这将使我的输出格式看起来更好,因为 (0) 或 (1) 之后的任何内容都是垃圾。

有人知道如何实现吗?

输入:

2013-02-21 00:12:03,374 [Thread] IN ProcedureTask - Finished Sales Summary 22 This (0) - 21-JUNE-10    

输出:

2013-02-21 00:12:03,374 IN ProcedureTask - Finished Sales Summary 22 This (0)

编辑:感谢所有对此主题发表评论的人,尤其是 ED 和 GLENN

更新:

awk -v pattern="$alineimlookingfor" '
    [=10=] ~ pattern {
        rec =  OFS  OFS  OFS 
        for (i=9; i<=NF; i++) {
            rec = rec OFS $i
            if ($i ~ /\([01]\)/) {
                break
            }
        }
        print rec
    }
' "$FILE"

应该完全符合您的要求

备注:

  • NF 是一个 awk 变量,包含当前记录中的 NF 字段。
  • 当我们看到包含该模式的记录时:
    • 将前 4 个字段存储在名为 rec 的变量中,由 O 输出 F 字段分隔 S分离器.
    • 遍历从 9 到最后的字段,附加到 rec 变量
      • 当我们看到与正则表达式匹配的一个(括号中的零或一)时,我们就会跳出 for 循环
    • 并打印累积的 rec 字符串。

首先,要知道awk可以做catgrep做的事情,所以我们可以立即简化管道

awk -v pattern="$alineimlookingfor" '[=11=] ~ pattern {print , , , , ... all the way to }' "$FILE"

接下来,听起来你想

awk -v pattern="$alineimlookingfor" '
    [=12=] ~ pattern {
        for (i=9; i<NF; i++) {
            if ($i == "(0)" || $i == "(1)") {
                NF = i
                break
            }
        }
        print
    }
' "$FILE"

这会更改 "number of fields in this record" 变量,以便忽略后续字段。

测试

alineimlookingfor=ProcedureTask
awk -v pattern="$alineimlookingfor" '
    [=13=] ~ pattern {
        for (i=9; i<NF; i++) {
            if ($i == "(0)" || $i == "(1)") {
                NF = i
                break
            }
        }
        print
    }
' <<'END'
foo
2013-02-21 00:12:03,374 [Thread] IN ProcedureTask - Finished Sales Summary 22 This (0) - 21-JUNE-10    
bar
2013-02-21 00:12:03,374 [Thread] IN ProcedureTask - Finished Sales Summary 22 This (1) - 21-JUNE-10    
baz
2013-02-21 00:12:03,374 [Thread] IN ProcedureTask - Finished Sales Summary 22 This (2) - 21-JUNE-10    
END

产出

2013-02-21 00:12:03,374 [Thread] IN ProcedureTask - Finished Sales Summary 22 This (0)
2013-02-21 00:12:03,374 [Thread] IN ProcedureTask - Finished Sales Summary 22 This (1)
2013-02-21 00:12:03,374 [Thread] IN ProcedureTask - Finished Sales Summary 22 This (2) - 21-JUNE-10