计数记录与Awk的匹配模式


13

因此,我被告知要做的last > lastloggedin是创建一个文件,该文件显示自上次系统重新引导以来最后一次登录的类。现在,我被要求编写一个Awk脚本,该脚本的名称myawk可以计算/确定lastloggedin包含该字符串的行 数CFS264

我已经搞定了 grep -c CFS264 lastloggedin


你要用awk吗?如果没有,您可以使用grep -c CFS264 lastloggedin | wc -l
Axel 2014年

2
@Axel:grep -c (something) (something) | wc -l始终产生“ 1”。
G-Man说'

Answers:


21

首先,您可以使用awk以下命令在文件中搜索包含以下字符串的行:

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

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

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

至于计数,如果您搜索“ awk counter”,您将偶然发现标题为:使用awk计数记录数的 SO Q&A 。此处显示的方法足以满足您的描述:

$ 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

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

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

抱歉,cfs264是用户名的一部分。谢谢你们花时间帮助我解决这个问题,我感到非常困惑和沮丧。
TayshaunS 2014年

@TayshaunS-np,非常欢迎您,感谢Q并祝您好运awk
slm

5

以下示例计算了不需要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/获得的所有用户名containig给定的字符或$1~/^prefix/只匹配字符开头的名称prefix

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


PS:

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

awk 非常有益:学习很短的时间后,您可以做很多事情...


2

最后可以包括用户从先前的重新引导中登录。因此,以下将仅打印自上次重启以来的用户:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.