Вы можете использовать, например, awk для захвата заголовков в первой строке и повторять их каждые 10 строк, а также уменьшить размер столбца, скажем, до 5 символов с чем-то вроде этого:
tail -n +1 -f file.csv |
awk 'NR==1 { n=split($0,hdr) }
NR%10==1 { for(i=1;i<=n;i++)printf "%5.5s ",hdr[i];printf "\n" }
{ for(i=1;i<=n;i++)printf "%5.5s ",$i;printf "\n" }
'
Это даст что-то вроде
yAcce zAcce xGyro...
3 256 1...
4 255 3...
4 255 -6...
3 253 -1...
4 254 2...
5 255 0...
4 255 3...
5 254 3...
5 253 -1...
4 255 3...
yAcce zAcce xGyro...
3 256 1...
...
Если ширина все еще слишком широка для вашего терминала, вы можете передать результат в less -S +F
, что сделает его похожим на tail -f
, но позволит вам прокручивать влево и вправо с помощью стрелок, если вы приостановите хвост с помощью Control -C. Чтобы продолжить, введите F
.
Ваш первый подход работает, вам просто нужно дать командуifne
(см.man ifne
):
NAME
ifne - Run command if the standard input is not empty
SYNOPSIS
ifne [-n] command
DESCRIPTION
ifne runs the following command if and only if the standard input is
not empty.
Значит, нужно дать ему команду запуститься. Ты почти у цели, tee
сработает:
command | ifne tee myfile > /dev/null
Если ваша команда не производит огромное количество данных, если они достаточно малы, чтобы поместиться в переменную,вы также можете сделать:
var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile
Решение для пешеходов:
tmpfile=$(mktemp)
mycommand >"$tmpfile"
if [ -s "$tmpfile" ]; then
cat "$tmpfile" >myfile
fi
rm -f "$tmpfile"
То есть сохранить вывод во временный файл, а затем проверить, пустой он или нет. Если он не пуст, скопируйте его содержимое поверх вашего файла. В конце удалите временный файл.
Я использую cat "$tmpfile" >myfile
, а неcp "$tmpfile" myfile
(или mv
), чтобы получить тот же эффект, который вы получили бы от mycommand >myfile
, т. е. чтобы обрезать существующий файл и сохранить права собственности и разрешения.
Если $TMPDIR
(, используемый mktemp
), находится в смонтированной в памяти -файловой системе, то это не будет производить запись на диск, за исключением, возможно, записи в myfile
. Кроме того, это было бы более портативно, чем использование ifne
.