我需要编写一个命令或命令序列,列出使用 Last 和 grep 在星期一登录的所有用户。我想出了这个,但没有成功:
grep -i /var/log/wtmp | grep -i /var/log/wtmp | grep -i /var/log/wtmp |最后-t 20150731
答案1
last | grep -i Mon
(尽管-i
如果您像我一样将“Mon”大写,则不需要该选项)
您提出的解决方案有一些问题:
管道
|
符号将第一个程序(左侧)的标准输出发送(通过管道)到第二个程序(作为标准输入)。所以你要做的就是尝试将grep -i /var/log/wtmp
to的输出通过管道传输last -t 20150731
。由于last
输出登录信息,因此它需要放在第一位。grep -i /var/log/wtmp
尝试在标准输入中查找“/var/log/wtmp”(不区分大小写)。可以grep
搜索文件,但该文件位于您要搜索的内容之后(例如,在grep find_me in_this_file
文件in_this_file
中搜索字符串“find_me”)。由于未指定文件,因此它在标准输入中查找。对于第一个(在管道之前),这就是;last
的输出。last
但对于grep
第一个,这就是您在按 Enter 执行命令后键入的内容。在这种情况下,您实际上需要使用
grep
搜索“Mon”,而不是“/var/log/wtmp”。last
使用“/var/log/wtmp”,但所有grep
关心的是 的输出last
,而不是last
从哪里获取其数据。last -t 20150731
将输出截至(但不包括)2015 年 7 月 31 日的所有登录信息。(要包括 7 月 31 日,您需要指定 8 月 1 日作为日期。)唯一的问题是last
日期中需要连字符除非您指定完整的时间(包括秒)。因此,您需要连字符 inlast -t 2015-07-31
但不需要连字符last -t 20150731000000
(两者都指定同一时间,午夜开始2015 年 7 月 31 日)。您最初的问题没有指定需要按日期限制列表,因此我将其排除在上面的答案之外;如果您确实需要按日期进行限制,请使用last -t 2015-07-31
列出截至 7 月 30 日(不包括 7 月 31 日)或last -t 2015-08-01
截至 7 月 31 日的列表。
grep
有关更多详细信息(包括使用正则表达式和 的不同时间格式可以完成的所有有趣的事情),请尝试使用和last
来查看手册页。man grep
man last
上面按时间倒序显示登录(最近的在前)。尽管通过添加另一个命令超出了原始问题的限制,但您也可以通过将结果通过管道传输grep
到tac
命令:按时间顺序显示结果(最近的最后一个)last | grep -i Mon | tac
。
答案2
last | grep Mon | awk '{print $1}' | sort -u