Awk 如果表达式不在记录中,则打印

Awk 如果表达式不在记录中,则打印,awk,Awk,我试图让我的程序通过一个日志文件进行解析,试图找到单词“user”并将其打印到页面上,如果找不到,则打印“N/a”。这第一行代码是我在尝试编写else语句之前的原始示例: awk '{for(i=1;i<=NF;i++){if($i~/^user/){print $i}}}' myFile 示例输出如下所示(我有另一段代码修剪“user=”bit off later): 在上面的示例中,上面的记录没有用户字段(它们可能是状态消息或错误消息)。我不想跳过它们,而是希望包含一个空行或其他标记

我试图让我的程序通过一个日志文件进行解析,试图找到单词“user”并将其打印到页面上,如果找不到,则打印“N/a”。这第一行代码是我在尝试编写else语句之前的原始示例:

awk '{for(i=1;i<=NF;i++){if($i~/^user/){print $i}}}' myFile
示例输出如下所示(我有另一段代码修剪“user=”bit off later):


在上面的示例中,上面的记录没有用户字段(它们可能是状态消息或错误消息)。我不想跳过它们,而是希望包含一个空行或其他标记,这样当我执行
粘贴myfile myfile2>myfile3
命令时,即使不是每列都有一个用户字段,列也会匹配。

您需要设置一个标志,并且只打印带有该标志的“N/a”。大概是这样的:

awk '{f=0;for(i=1;i<=NF;i++){if($i~/^user/){print $i;f=1}}if(!f){print "N/A"}}' myFile
特殊变量
FPAT
用于描述字段的格式。在这里,模式与“user=”匹配,后跟一个或多个非空格字符
\S+
(必须转义
\
,这就是为什么它是
\
)。如果没有与模式匹配的字段,则
NF
为0(即false),并打印“N/A”。否则,将打印最后一个匹配字段


当然,如果每条记录可能有多个用户,这将不起作用,但从您的示例中可以看出,只有零个或一个用户。

您需要设置一个标志,并仅在该标志上打印“N/a”。大概是这样的:

awk '{f=0;for(i=1;i<=NF;i++){if($i~/^user/){print $i;f=1}}if(!f){print "N/A"}}' myFile
$ awk '{print (match($0,/user=[^ ]+/) ? substr($0,RSTART,RLENGTH) : "N/A")}' file
user=jim
N/A
user=paul
user=reggie
N/A
特殊变量
FPAT
用于描述字段的格式。在这里,模式与“user=”匹配,后跟一个或多个非空格字符
\S+
(必须转义
\
,这就是为什么它是
\
)。如果没有与模式匹配的字段,则
NF
为0(即false),并打印“N/A”。否则,将打印最后一个匹配字段

当然,如果每条记录可能有多个用户,这将不起作用,但从您的示例中可以看出,只有零个或一个用户。

如果您碰巧找到与您的用户匹配的字段,我建议使用该语句

$ awk '{print (match($0,/user=[^ ]+/) ? substr($0,RSTART,RLENGTH) : "N/A")}' file
user=jim
N/A
user=paul
user=reggie
N/A
awk'{for(i=1;i如果您碰巧找到与您的用户匹配的字段,我建议使用该语句


awk'{for(i=1;我也可以做
awk'$0=match($0,/user=[^]+/,a)?a[0]:“N/a”
。在评论中发布,因为它与您的答案太相似了。这将是一个具体的问题,尽管第三个参数是match()虽然我并不反对在有用的时候使用特定于gawk的答案,但我个人认为在这种情况下它不够有用。我也不太喜欢在你知道你想打印当前行时,依靠$0的值来调用默认操作。公平地说,每个人都有自己的偏好。我只是想我会发布它以显示不同/类似的方式:)是的,无论哪种方式都是nbd。不过你可能想用括号括住三元表达式-一些awk可以将
x=a?b:c
解释为
(x=a)?b:c
而不是你想要的
x=(a?b:c)
。我相信如果你写
print a?b:c
,而不是
print(a?b:c),BSD awk会产生语法错误
。谢谢,我会记住这一点。虽然在上面的例子中,这不重要,因为你已经指出,我使用的是gawk特有的语法;)也可以做
awk'$0=match($0,/user=[^]+/,a)?a[0]:“N/a”
。在评论中发布,因为它与你的答案太相似。这将是gawk特有的,尽管有第三个匹配参数提供()虽然我并不反对在有用的时候使用特定于gawk的答案,但我个人认为在这种情况下它不够有用。我也不太喜欢在你知道你想打印当前行时,依靠$0的值来调用默认操作。公平地说,每个人都有自己的偏好。我只是想我会发布它以显示不同/类似的方式:)是的,无论哪种方式都是nbd。不过你可能想用括号括住三元表达式-一些awk可以将
x=a?b:c
解释为
(x=a)?b:c
而不是你想要的
x=(a?b:c)
。我相信如果你写
print a?b:c
,而不是
print(a?b:c),BSD awk会产生语法错误
。谢谢,我会记住这一点。虽然在上面的案例中,这并不重要,因为您已经指出,我使用的是gawk特定的语法;)最多有一个用户是正确的,是的。如果有两个案例,我想我可以添加另一个案例,如果它能帮助未来的人看这个问题。最多有一个用户是正确的,是的。我想我可以补充另一个案例,如果有两个案例的话,这将有助于未来的人们研究这个问题。
awk '{f=0; for (i=1;i<=NF;i++) if ($i~/^user/) {print $i; f=1} if (!f) print "N/A" }' myFile
$ cat file
status-code=32 action=add user=jim
status-code=43 message=otherException
status-code=32 action=add user=paul
status-code=32 action=delete user=reggie
status-code=2 action=endFile
$ awk '{f=0; for (i=1;i<=NF;i++) if ($i~/^user/) {print $i; f=1} if (!f) print "N/A" }' file
user=jim
N/A
user=paul
user=reggie
N/A
$ awk -v FPAT='user=\\S+' '{print NF ? $NF : "N/A"}' file
user=jim
N/A
user=paul
user=reggie
N/A
$ awk '{print (match($0,/user=[^ ]+/) ? substr($0,RSTART,RLENGTH) : "N/A")}' file
user=jim
N/A
user=paul
user=reggie
N/A
awk '{for(i=1;i<=NF;i++){if($i~/^user/){print $i; next;}} print "N/A";}' myFile