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.