1

我需要使用“last”来搜索登录系统的用户列表,即

last -f /var/log/wtmp <username>

考虑到该目录中 bzip 归档文件的数量,并考虑到我在共享系统上,我试图包含一个内联 bzcat,但似乎没有任何效果。我尝试了以下组合但没有成功:

last -f <"$(bzcat /var/log/wtmp-*)"
last -f <$(bzcat /var/log/wtmp-*)
bzcat /var/log/wtmp-* | last -f -

让我发疯。任何输入都会很棒!

4

2 回答 2

1

last(假设是 Linux 版本)无法从管道中读取。您需要暂时bunzip2读取文件。

tempfile=`mktemp` || exit 1

for wtmp in /var/log/wtmp-*; do
    bzcat "$wtmp" > "$tempfile"
    last -f "$tempfile"
done

rm -f "$tempfile"
于 2012-02-20T16:31:24.207 回答
1

您一次只能<对一个文件使用 I/O 重定向。

如果有什么可行的,那么你的例子的最后一行就是它,但是否last识别-为标准输入?(另一个答案中的评论表明“不,last不承认-”。现在你明白为什么遵守所有约定很重要 - 如果你不这样做,生活会很困难。)如果做不到这一点,你将不得不做经典用shell循环的方式。

for file in /var/log/wtmp-*
do
    last -f <(bzcat "$file")
done

好吧,使用这样的进程替换是纯 Bash ......经典的方式更像是:

tmp=/tmp/xx.$$   # Or use mktemp
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15

for file in /var/log/wtmp-*
do
    bzcat $file > $tmp
    last -f $tmp
done

rm -f $tmp
trap 0
于 2012-02-20T16:33:59.450 回答