sed
přístup je v pořádku, ale smyčka přes všechny řádky ne. Pokud víte, kolik řádků si chcete ponechat (abych měl příklad, zde používám 99), můžete to udělat takto:
sed -i '100,$ d' myfile.txt
Vysvětlení:sed
je procesor regulárního výrazu. S volbou -i
daný soubor zpracovává přímo („inline“) – namísto pouhého čtení a zápisu výsledků na standardní výstup. 100,$
znamená pouze "od řádku 100 do konce souboru" -- a následuje příkaz d
, což jste pravděpodobně správně uhodli, že znamená „smazat“. Příkaz tedy ve zkratce znamená:"Smazat všechny řádky od řádku 100 do konce souboru z myfile.txt". 100 je první řádek, který má být odstraněn, protože chcete zachovat 99 řádků.
Upravit: Pokud na druhou stranu existují soubory protokolu, kde chcete uchovávat např. poslední 100 řádků:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
Co se tady děje:
[ $(wc -l myfile.txt) -gt 100 ]
:následující proveďte pouze v případě, že soubor má více než 100 řádků$((100 - $(wc -l myfile.txt|awk '{print $1}')))
:vypočítat počet řádků k odstranění (tj. všechny řádky souboru kromě (posledních) 100 k zachování)1, $((..)) d
:odebrat všechny řádky od prvního po vypočítaný řádek
UPRAVIT: protože otázka byla právě upravena, aby poskytla další podrobnosti, zahrnu tyto dodatečné informace také do své odpovědi. Přidaná fakta jsou:
- konkrétní velikost zůstane v souboru (10 000 bajtů)
- každý řádek má určitou velikost v bajtech (v příkladu 300 bajtů)
Z těchto údajů je možné vypočítat počet řádků, které zůstanou jako "/", což by v příkladu znamenalo 33 řádků. Skořápkový výraz pro výpočet:$((size_to_remain / linesize))
(alespoň na Linuxu pomocí Bash je výsledkem celé číslo). Upravený příkaz by nyní zněl:
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
Vzhledem k tomu, že velikosti jsou známy předem, není již potřeba žádný výpočet vložený do sed
příkaz. Ale kvůli flexibilitě lze uvnitř některých skriptů shellu použít proměnné.
Pro podmíněné zpracování založené na velikosti souboru lze použít následující "testovací" konstrukt:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
což znamená:"pokud je velikost $file
přesahuje 100 kB, udělejte...“ (ls -lk
uvádí velikost souboru v kB na pozici 5, tedy awk
se používá k extrahování přesně tohoto).