我需要使用'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 -
让我疯狂。任何输入都会很棒!
答案 0 :(得分: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"
答案 1 :(得分: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