如何使用 grep 和 last 列出在特定日期登录的所有用户

如何使用 grep 和 last 列出在特定日期登录的所有用户

我需要编写一个命令或命令序列,列出使用 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/wtmpto的输出通过管道传输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 grepman last

上面按时间倒序显示登录(最近的在前)。尽管通过添加另一个命令超出了原始问题的限制,但您也可以通过将结果通过管道传输greptac命令:按时间顺序显示结果(最近的最后一个)last | grep -i Mon | tac

答案2

last | grep Mon | awk '{print $1}' | sort -u

相关内容