Chci "grep" z "řádku 2A" na konec souboru:
sed -n '/2A/,$p'
- -n :potlačit
sedvý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.