GNU/Linux >> Znalost Linux >  >> Linux

Jak získat n-tý řádek po grepovaném řádku?

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]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.


Linux
  1. Jak získat počet souborů v adresáři pomocí příkazového řádku?

  2. Jak zastavit příkaz Najít po prvním zápase?

  3. Jak získat klíč USB k automatickému připojení?

  1. Jak posunout řádek v textovém souboru nahoru nebo dolů o jeden řádek?

  2. Jak spočítat počet řádků v souboru po zápase Grep?

  3. Jak získám ekvivalent /dev/one v Linuxu

  1. Jak bezpečně získat verzi Ksh?

  2. Jak získat verzi ovladače nvidia z příkazového řádku?

  3. Jak získat adresu URL souboru Dropbox z příkazového řádku?