Portál AbcLinuxu, 12. května 2025 05:12
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.)
#!/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}'
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.
cat
em? 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.