Tay*_*unS 16 scripting awk text-processing
所以我被告知要last > lastloggedin创建一个文件,该文件显示自上次系统重新启动以来上次登录的类,现在我被要求编写一个 Awk 脚本,该脚本命名为myawk计数/确定lastloggedin包含字符串的行 数CFS264。
我弄完了 grep -c CFS264 lastloggedin
slm*_*slm 25
为了让您开始,您可以使用awk在文件中搜索包含如下字符串的行:
$ awk '/CFS264/ { .... }' lastloggedin
Run Code Online (Sandbox Code Playgroud)
中的位{ .... }将是用该字符串计算行数所需的命令。要确认上述工作正常,您可以print $0在其中使用 a来简单地打印包含搜索字符串的那些行。
$ awk '/CFS264/ { print $0 }' lastloggedin
Run Code Online (Sandbox Code Playgroud)
至于计数,如果你搜索“awk counter”,你会偶然发现这个题为:using awk to count no of records 的SO Q&A 。那里显示的方法足以满足您的描述:
$ awk '/CFS264/ {count++} END{print count}' lastloggedin
Run Code Online (Sandbox Code Playgroud)
$ last > lastloggedin
$ awk '/slm/ {count++} END {print count}' lastloggedin
758
$ grep slm lastloggedin | wc -l
758
$ grep -c slm lastloggedin
758
Run Code Online (Sandbox Code Playgroud)
注意:您没有在last输出中说明CFS264 属于哪个字段。假设它是一个用户名,那么您可以进一步限制该awk命令仅搜索该字段,如下所示:
$ awk '$1=="CFS264" { print $0 }' lastloggedin
Run Code Online (Sandbox Code Playgroud)
小智 5
以下示例计算了我在不需要lastloggedin文件的情况下被提及的次数:
$ last | awk '$1=="yeti" { ++count } END { print count }'
106
Run Code Online (Sandbox Code Playgroud)
如果您坚持使用或被迫使用该lastloggedin文件,您可以这样做:
$ last > lastloggedin
$ awk '$1=="yeti" { ++count } END { print count }' lastloggedin
106
Run Code Online (Sandbox Code Playgroud)
使用$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
Run Code Online (Sandbox Code Playgroud)
扫描man awk更多提示... ;-)
awk 非常有收获:经过很短的学习时间,您可以做很多事情......