GNU/Linux >> Znalost Linux >  >> Linux

Linux - grep od určitých řádků až do konce souboru

Chci "grep" z "řádku 2A" na konec souboru:

sed -n '/2A/,$p'
  • -n :potlačit sed výchozí výstup
  • /2A/ :výstupní řádky z prvního obsahujícího "2A"
  • $ :na konec souboru

Chci "grep" z "řádku 2A" na další řádek, který obsahuje "A":

sed -n '/2A/,/A/p'
  • /A/ :výstup, dokud řádek neobsahuje "A"

Chci "grep" z prvního řádku obsahujícího "A" na další:

printf "/A\n.+1,/A/p\nq" | ed -s
$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

(rozbaleno z komentáře)

awk má schopnost vybrat „rozsahy“ řádků, které dokonale odpovídají této potřebě, jak je popsáno v příručce GNU-awk (gawk). (Tato funkce funguje v jiných awk s ale gawk návod lze snadno propojit.)

awk '/line 2A/,0' vytiskne řádky začínající prvním, který odpovídá line 2A a pokračovat až do konce vstupu, protože 0 je podmínka, která nikdy není pravdivá.

awk '/line 2A/,/A/&&!/line 2A/' začne tisk s řádkem, který odpovídá line 2A a zastaví se za řádkem, který odpovídá A ale NE line 2A (a proto nemůže být stejná jako startovní čára). Spustí se znovu následně line 2A a tak dále; chcete-li tomu zabránit, existují o něco složitější způsoby, jak to udělat.

Pokud zastavovací řádky mají vždy jiný znak než 2 před A to lze zjednodušit na awk '/line 2A/,/[^2]A/' která končí za řádkem, který odpovídá jakémukoli znaku jinému než 2, za kterým následuje A. Možná budete chtít variantu tohoto, např. zastavit na libovolném jednomístném A jiném než 2A, ale ne na jiném, jako je WHAT; proto může být podmínka zastavení ,/line [013-9]A/ .


Myslím, že nejlepší způsob je použít grep v kombinaci s cut a tail . Nejprve použijte grep k získání řádku, na kterém je požadovaný řetězec (-n na výstupní číslo řádku; -m 1 pro zastavení vyhledávání po první shodě):

grep -n -m 1 "somestring" filename.txt

Tím se vypíše číslo řádku a samotný řetězec. K odříznutí provázku použijeme cut (-f1 :výstup prvního pole; -d: použijte ":" jako oddělovač):

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

Dále použijeme výstup tohoto příkazu jako parametr v tailu. Normálně, tail vytiskne posledních k řádků, ale s použitím -n +k , dostaneme ocas k tisku od řádku k dále. Celkový příkaz je:

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

Pro výstup řádků do somestring použijte head místo tail a -n -# místo -n +# . Můžete také zkombinovat oba a získat tak řádky z jednoho řetězce do druhého.


Linux
  1. Práce s rourami na příkazovém řádku Linuxu

  2. Hlášení I/O z příkazového řádku Linuxu

  3. Jak pomocí příkazu Linux „cat“ zobrazit pouze určité řádky podle čísla?

  1. Náhodně nakreslit určitý počet řádků z datového souboru?

  2. Přejít na začátek nebo konec souboru ve Vimu [Rychlý tip]

  3. Jak počítat řádky v souboru v UNIX/Linux

  1. Používání Disku Google z příkazového řádku systému Linux

  2. Odstraňte určitý řádek ze souboru historie Bash

  3. Jak zobrazit určité řádky z textového souboru v Linuxu?