因此,我被告知要last > lastloggedin
创建一个文件,显示自上次系统重新启动以来上次登录的类,现在要求我编写一个 Awk 脚本,该脚本的名称是计算/确定包含 stringmyawk
的行数 。lastloggedin
CFS264
我已经搞定了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 命令的第一部分指定一个范围 - 从第一行开始直到第一列为“reboot”。