Как прочитать вывод из bzcat вместо указания имени файла - PullRequest
1 голос
/ 20 февраля 2012

Мне нужно использовать '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 ]

1 голос
/ 20 февраля 2012

Вы можете использовать только < перенаправление ввода / вывода для одного файла за раз.

Если что-то сработает, то последняя строка ваших примеров это, но last распознает- как означает стандартный ввод?(В комментариях к другому ответу указано «Нет, last не распознает -». Теперь вы понимаете, почему важно следовать всем соглашениям - это усложняет жизнь, когда вы этого не делаете.) В противном случае выЯ должен сделать это классическим способом с помощью цикла оболочки.

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
1 голос
/ 20 февраля 2012

last (при условии, что версия Linux) не может читать из канала.Вам понадобится временно bunzip2 файлы, чтобы прочитать их.

tempfile=`mktemp` || exit 1

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

rm -f "$tempfile"
...