Я сделал простой сценарий оболочки, который покажет вам, сколько раз наша система перезагружалась в день.
#!/bin/bash
day=$(date | awk {'print $1 " " $3 " " $2'})
echo $day
reboot_times=$(last reboot | grep "$day" | wc -l)
echo $reboot_times times rebooted
выход
Ср
2 раза перезагрузился
В zsh
и GNUtail
(не все хвостовые реализации могут принимать более одного аргумента имени файла, и не все из них будут отображать имена файлов):
() { (($# == 0)) || tail -vn +1 -- "$@" < /dev/null; } *(ND)
-v
по-прежнему печатать имена файлов, даже если есть только один файл, D
для dotglob, N
для nullglob, используя анонимную функцию, которая передает расширение этого глобуса и проверяет особый случай текущего каталога быть пустым.
</dev/null
частично смягчает тот факт, что GNU tail
при передаче имени файла с именем -
вместо этого будет читать стандартный ввод. Здесь мы просто запрещаем ему читать стандартный ввод, но он по-прежнему не будет читать файл с именем -
. Другой подход заключается в использовании "${@/#%-/./-}"
вместо "$@"
для замены -
на ./-
, но это также будет означать, что вы увидите ==>./- <==
вместо ==> - <==
для файла -
(все же, вероятно, лучше, чем==> standard input <==
).
Вы также можете добавить квалификатор.
(или-.
)glob, чтобы ограничить обычными файлами только во избежание ошибок или еще хуже, если есть каталоги или другие типы не -обычных файлов. файлы в текущем каталоге(*(ND-.)
).
То же самое с ksh93
и GNUtail
:
(
FIGNORE='@(.|..)'
set -- ~(N)*
(($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)
То же самое с bash
и GNUtail
:
(
setopt -s nullglob dotglob
set -- *
(($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)
Или с GNU tail
и любым POSIX sh
(, включая zsh
, но только в sh
эмуляции ), также ограничение на обычные или символические ссылки на обычные файлы и замена -
на ./-
, но потенциально обрабатываем файлы в другом порядке, так как мы делаем .*
одни перед другими:
(
set --
for file in.* *
[ -f "$file" ] || continue
[ "$file" = - ] && file=./-
set -- "$@" "$file"
done
[ "$#" -eq 0 ] || exec tail -n +1 -- "$@"
)
Или вы можете использовать GNUawk
(здесь сzsh
):
() {
(( $# == 0 )) ||
gawk 'BEGINFILE{
print sep "==> "substr(FILENAME, 3)" <=="
sep = "\n"
}
{print}' "$@"
} *(ND-.)
awk
имеет ту же проблему, что и tail
с -
, а также с именами файлов, содержащими =
. Мы работаем с обоими, добавляя префикс ./
, который мы удаляем при отображении. Обратите внимание, что awk добавляет символ новой строки, если он отсутствует в конце файлов.
Или используйте цикл:
sep=
for f (*(ND-.)) {
print -r "$sep==> $f <=="
sep=$'\n'
cat < $f
}
(cat
имеет ту же проблему, что и -
,который мы обходим, передавая файл на стандартный ввод вместо аргументов)