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 变量,包含当前记录中的 N 个 F 字段。
- 当我们看到包含该模式的记录时:
- 将前 4 个字段存储在名为
rec
的变量中,由 O 输出 F 字段分隔 S分离器.
- 遍历从 9 到最后的字段,附加到
rec
变量
- 当我们看到与正则表达式匹配的一个(括号中的零或一)时,我们就会跳出
for
循环
- 并打印累积的
rec
字符串。
首先,要知道awk
可以做cat
和grep
做的事情,所以我们可以立即简化管道
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
我的密码是
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 变量,包含当前记录中的 N 个 F 字段。- 当我们看到包含该模式的记录时:
- 将前 4 个字段存储在名为
rec
的变量中,由 O 输出 F 字段分隔 S分离器. - 遍历从 9 到最后的字段,附加到
rec
变量- 当我们看到与正则表达式匹配的一个(括号中的零或一)时,我们就会跳出
for
循环
- 当我们看到与正则表达式匹配的一个(括号中的零或一)时,我们就会跳出
- 并打印累积的
rec
字符串。
- 将前 4 个字段存储在名为
首先,要知道awk
可以做cat
和grep
做的事情,所以我们可以立即简化管道
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