如何从bzcat读取输出而不是指定文件名

时间:2012-02-20 16:23:05

标签: bash redirect pipe bzip2

我需要使用'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 -

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

2 个答案:

答案 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