使用 Awk 计算匹配模式的记录数

使用 Awk 计算匹配模式的记录数

因此,我被告知要last > lastloggedin创建一个文件,显示自上次系统重新启动以来上次登录的类,现在要求我编写一个 Awk 脚本,该脚本的名称是计算/确定包含 stringmyawk的行数 。lastloggedinCFS264

我已经搞定了grep -c CFS264 lastloggedin

答案1

首先,您可以使用awk搜索文件中包含字符串的行,如下所示:

$ awk '/CFS264/ { .... }' lastloggedin

中的位{ .... }将是计算该字符串的行数所需的命令。要确认上述内容是否有效,您可以print $0在其中使用 a 来简单地打印包含搜索字符串的那些行。

$ awk '/CFS264/ { print $0 }' lastloggedin

至于计数,如果你搜索“awk counter”,你会偶然发现这个标题为“awk counter”的问答:使用 awk 计算记录数。那里显示的方法足以满足您所描述的内容:

$ awk '/CFS264/ {count++} END{print count}' lastloggedin

例子

$ last > lastloggedin

$ awk '/slm/ {count++} END {print count}' lastloggedin 
758

$ grep slm lastloggedin  | wc -l
758

$ grep -c slm lastloggedin
758

笔记:您没有在输出中说明 CFS264 属于哪个字段last。假设它是用户名,那么您可以进一步限制命令awk仅搜索该字段,如下所示:

$ awk '$1=="CFS264" { print $0 }' lastloggedin

答案2

以下示例计算了我在不需要该lastloggedin文件的情况下被提及的次数:

$ last | awk '$1=="yeti" { ++count } END { print count }' 
106

如果您坚持使用或被迫使用该lastloggedin文件,可以这样做:

$ last > lastloggedin
$ awk '$1=="yeti" { ++count } END { print count }' lastloggedin
106

用于$1~/some_chars/获取包含给定字符的所有用户名或$1~/^prefix/仅匹配以 开头的名称prefix

$ last | awk '$1~/et/ { ++count } END { print count }'
106
$ last | awk '$1~/^ye/ { ++count } END { print count }'
106


附:

扫描man awk以获取更多提示...;-)

awk非常有价值:经过很短的学习时间,你可以做很多事情......

答案3

最后一次可以包括以前重新启动的用户登录。因此,以下内容将仅打印自上次重新启动以来的用户:

last | awk 'NR==1,$1=="reboot"{if ($1 ~ /cfs264/ ) { count+=1; }}END{ print count; }'

awk 命令的第一部分指定一个范围 - 从第一行开始直到第一列为“rebo​​ot”。

相关内容