Portál AbcLinuxu, 30. října 2025 13:44
head, tail apod.), který by uměl vypsat každý n-tý řádek? Nebo dokonce třeba každou sekundu vypsal poslední řádek, který dostal na vstupu? Napsat to třeba v Pythonu by nebyl problém, ale žíkám si, že už to musí existovat…
K čemu bych to potřeboval? Některé programy mají jen dvě volby 2: buď něco dělá, ale nevypisuje nic, nebo vypisuje info třeba o každém zpracovávaném souboru. Např. cp kopíruje a kopíruje a nezbývá, než čekat až (zda) skončí. Naproti tomu cp -v vypisuje název každého kopírovaného souboru. Což při vzdáleném připojení přes ssh taky není úplně ono… Líbilo by se mi přesměrovat výstup cp -v do nějakého filtru, který by vypsal třeba každý stý řádek. Takže bych věděl, že se něco děje, případně bych dokázal zjistit, kde se kopírování zaseklo, ale neposílal by se mi zbytečně dlouhatánský výpis.
cp -g?
tail -f /cesta/k/souboru_kde_mi_na_konci_pribyvaji_radkyTím souborem může být třeba log, nebo přesměrovaný výstup, atd. atd.. Je tolik možností a variant...
tail -f vypisuje data, která byla do streamu přidána od posledního výpisu, tj. vypíše je všechna. Takže psát
cat soubor.txt | tail -fvyjde nastejno, jako
cat soubor.txtakorát je to daleko složitější a neefektivnější. Ale jinak díky za snahu
first~step
Match every step'th line starting with line first. For example,
``sed -n 1~2p'' will print all the odd-numbered lines in the
input stream, and the address 2~5 will match every fifth line,
starting with the second. (This is an extension.)
Ale darovanému koni na zuby nekoukej
S tím výpisem v pravidelném časovém intervalu jsem si už asi navymýšlel moc, jdu oprášit své znalosti Pythonu
#!/bin/bash
let I=0
while read line; do
let I++
if [ $I -eq 10 ]; then
let I=0
echo $line
fi
done
sed -n '{n;n;n;n;n;n;n;n;n;p}' zdroj_radku.txtPro hůř chápavé:
cat zdroj_radku.txt | sed -n '{n;n;n;n;n;n;n;n;n;p}'
A že to je dlouhé? No jasně, když chce někdo vypsat pouze každý desátý řádek, tak musí uvést at udělá sed devětkrát hop (n). Možná to tedy jde zapsat i nějak jednodušeji (9 x n ?) ale nechce se mi to hledat.
catem? Abys ukázal že jej lze použít i na proud dat? No, ono by se od programu jménem Stream editor, řekl bych, dalo očekávat, že umí pracovat s proudem dat
# vypis $N riadkov zacinajuc riadkom $R tail +$R | head -$N
#!/usr/bin/env python
import time, sys
for i in xrange(10):
sys.stdout.write('%d\n' %i)
sys.stdout.flush()
time.sleep(1)
přesměruju tomuto programu
#!/usr/bin/env python
import sys
while True:
line = sys.stdin.readline()
if not line: break
sys.stdout.write(line)
Tak se to bude vypisovat hezky postupně. Ale kdybych v tom prvním programu vynechal flush(), tak mám prostě smůlu.cp. Stačí si vyzkoušet samotné
cp -v | lessnebo třeba
find … | lessŘádky se neobjevují postupně, ale vždy se objeví až celý kus výpisu najednou. Asi se holt budu muset smířit s tím, že takovýhle výpis zbytečně zaplňuje obrazovku a přenáší se po síti…
zsh, našel jsem stejný problém, jeho řešení je "úkrok stranou" – zsh to nejspíš neumí, odkazuje se tam na ptyget (autorem je DJB, což je snad záruka kvality), podívám se, co to umí…
Díky všem za rady. A taky díky adminům za přidání "v" do toho mého "ýpisu". Někdo mi ho musel cestou ukradnout, protože v náhledu určitě bylo
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.