Regex 使用awk提取日志文件中两个字符串之间的数字

Regex 使用awk提取日志文件中两个字符串之间的数字,regex,bash,awk,Regex,Bash,Awk,这是日志行的一个示例: 我想用PCRE(-p)查找在callee\u num:grep之后出现的号码: 使用GNUawk: awk 'match($0, /.* callee_num:<<\"(\+[0-9]+)\".*"/, a) {print a[1]}' file.txt awk'匹配($0,/.*callee_num:grep与PCRE(-p): 使用GNUawk: awk 'match($0, /.* callee_num:<<\"(\+[0-9]+)\".*

这是日志行的一个示例:
我想用PCRE(
-p
)查找在
callee\u num:
grep
之后出现的号码:

使用GNU
awk

awk 'match($0, /.* callee_num:<<\"(\+[0-9]+)\".*"/, a) {print a[1]}' file.txt

awk'匹配($0,/.*callee_num:
grep
与PCRE(
-p
):

使用GNU
awk

awk 'match($0, /.* callee_num:<<\"(\+[0-9]+)\".*"/, a) {print a[1]}' file.txt

awk'match($0,/.*callee_num:您可以使用sed执行此操作,默认情况下使用
-n
禁用打印:

sed -n 's/.*callee_num:<<"\([+0-9]*\)">.*/\1/p' file

sed-n的/*callee_num:您可以使用sed执行此操作,默认情况下使用
-n
禁用打印:

sed -n 's/.*callee_num:<<"\([+0-9]*\)">.*/\1/p' file

sed-n's/*callee_num:通过给出两个字段分隔符,用
分隔,您告诉
awk
使用其中一个作为分隔符


因此,当
awk
通过提供由
分隔的两个字段分隔符来查找被调用方的
编号:时,您告诉
awk
使用其中一个作为分隔符

因此,当
awk
查找被调用方编号:中的任何一个时,另一个awk:

$ awk '$7 ~ /<<\"/ {gsub(/.*<<"|">>$/, "", $7); print $7}' file
+6182290000648
如果

还有另一个awk:

$ awk '$7 ~ /<<\"/ {gsub(/.*<<"|">>$/, "", $7); print $7}' file
+6182290000648
如果
awk'{split($0,a,“callee_num:”)}{gsub(/“/,”,a[3]),则打印[3]}文件名
+6182290000648
awk'{split($0,a,“callee_num:”)}{gsub(/“/,”,a[3]);打印[3]}文件名
+6182290000648


hey,因为在第一行我有
callee\u num:@fedorqui-thx供你评论。我已经改变了我的问题。嘿,因为在第一行我有
callee\u num:@fedorqui-thx供你评论。我已经改变了我的问题。你是说用
awk
这是不可能的吗@heemayl@heemayi匹配不起作用。
awk:在源代码行1
@MaryamPashmi您必须使用Solaris。在这种情况下,请使用此awk-->/usr/xpg4/bin/awk以获得正确的版本。好的。我有操作系统mac,顺便说一句,thx sed正在使用我的版本。您是说使用
awk
不可能吗@heemayl@heemayi匹配不起作用。
awk:在源代码第1行退出
@maryampasm必须使用Solaris。在这种情况下,请使用此awk-->/usr/xpg4/bin/awk以获得正确的版本。好的。我有操作系统mac,顺便说一句,thx sed正在使用我的版本。sed中只有一个问题,
\1
\1
是反向引用,它指搜索模式中括号内捕获的第一组。使用exprSession在您的
sed
命令中,您还可以使用
match
调用
awk
,并说:
awk'match($0,/callee_num:/,res){print res[1]}文件
@fedorqui是的,但我认为matches数组是GNU扩展。我试图只使用标准功能:)是的,第三个参数(捕获组的参数)是GNU扩展。sed中只有一个问题,什么是
\1
\1
是一个反向引用,它指的是搜索模式中括号内捕获的第一组。使用
sed
命令中的表达式,您还可以使用
match
调用
awk
,并说:
awk'match($0,/callee_num:/,res){print res[1]}文件
@fedorqui是的,但我认为matches数组是GNU扩展。我试图只使用标准功能:)是的,第三个参数(捕获组的参数)是一个GNU扩展。我不明白你为什么使用
gsub
sub
在第一次匹配后停止,
gsub
没有。你必须从开头和结尾截断。在
gsub()中有两个匹配项,由
分隔(逻辑OR)。我不明白你为什么要使用
gsub
sub
在第一次匹配后停止,
gsub
没有。你必须从开头和结尾截断。其中有两个匹配项由
分隔(逻辑OR)。
sed -n 's/.*callee_num:<<"\([+0-9]*\)">.*/\1/p' file
awk 'sub(/.*callee_num:<<"/, "") && sub(/">.*/, "")' file
awk 'sub(/.*callee_num:<<"/, "") && sub(/">.*/, "") && /^[+0-9]+$/' file
$ awk -F '"' '{print $2}' /tmp/t
conxa3
$ awk -F '"' '{print $4}' /tmp/t
+6182290000648
$ awk '$7 ~ /<<\"/ {gsub(/.*<<"|">>$/, "", $7); print $7}' file
+6182290000648
callee_num:<<"+6182290000648">>
callee_num:+6182290000648
 awk '{split( $0,a,"callee_num:<<|>>") } {gsub(/"/,"",a[3]);print a[3]}' filename
 +6182290000648