Na předchozích dvou odpovědích není nic špatného, ale myslel jsem, že vás upozorním, že nalezení třetího řádku za vzorem lze provést v jediném sed
zavolejte:
sed -n "/four/ { n; n; p }" SourceData.txt
Protože práci vykonává jeden program, je to efektivnější než spouštění více filtrů. Výše uvedený příkaz vypíše třetí řádek po každé instanci "čtyři", kromě případů, kdy k tomu dojde znovu v jednom ze dvou řádků po shodě (ostatní řešení tento případ také nezpracovávají očekávaným způsobem); také není generován žádný výstup, pokud je vzor na posledním nebo předposledním řádku souboru, což může nebo nemusí být to, co chcete.
Chcete-li odpovídat pouze první instanci:
sed -n "/four/ { n; n; p; q }" SourceData.txt
(Všimněte si, že tato odpověď je co nejúčinnější tím, že ukončíte skenování, jakmile bude nalezena shoda.)
Toto řešení přidávám, protože stojí za to poznat sed
a přes svou poněkud odpudivou syntaxi (regulární výrazy jsou dost špatné!) může být často velmi užitečný. Tento tutoriál je dobrým úvodem.
Toto řešení vytiskne aktuální řádek, pokud před dvěma řádky došlo ke shodě. Je mírně odlišný od několika dalších odpovědí, protože nezmeškáte další zápas, i když k němu dojde brzy po předchozím zápase.
awk -v delay=2 '{for (i=delay; i>=0; i--) t[i]=t[i-1]} /four/ {t[0]="m"} {if (t[delay]) print}'
Kdykoli dojde ke shodě, informace se uloží do t[0]
. S každým řádkem t
pole je posunuto (včetně posunutí t[-1]
až t[0]
pro resetování hodnoty t[0]
). Řádek se vytiskne, pokud pole indikuje, že před dvěma řádky došlo ke shodě.
Můžete snadno nastavit jiné zpoždění (např. delay=7
) nebo použijte jiný vzor (např. /sda[[:digit:]]/
)
Můžete použít tento výraz (input.txt
):
grep "four" -A 2 input.txt | tail -n 1
Výstup je:
six 6
grep
volba "-A 2" uvádí, že se vytisknou dva řádky po odpovídajícím řádku.
A tail
volba "-n 1" uvádí, že pouze poslední 1
jsou vráceny řádky tohoto výsledku.