「2A 行目」からファイルの最後まで「grep」したい:
sed -n '/2A/,$p'
- -n :
sedを抑制 デフォルト出力 - /2A/ :「2A」を含む最初の行から出力します
- $ :ファイルの最後まで
「行 2A」から「A」を含む次の行まで「grep」したい:
sed -n '/2A/,/A/p'
- /A/ :行に「A」が含まれるまで出力します
「A」を含む最初の行から次の行まで「grep」したい:
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
(コメントから展開)
awk GNU-awk (gawk) マニュアルで説明されているように、このニーズに完全に一致する行の「範囲」を選択する機能があります。 (この機能は他の awk でも動作します) gawk マニュアルへのリンクは簡単です。)
awk '/line 2A/,0' line 2A に一致する最初の行から始まる行を出力します 0 であるため、入力の最後まで続行します 決して真ではない条件です。
awk '/line 2A/,/A/&&!/line 2A/' line 2A に一致する行から印刷を開始します A に一致する行の後に停止します ただし、line 2A ではありません (したがって、開始行と同じ行にすることはできません)。 再開します その後 line 2A 等々;それを防ぎたい場合は、もう少し複雑な方法があります。
停止行に常に 2 以外の文字がある場合 A の前 これは awk '/line 2A/,/[^2]A/' に簡略化できます これは、2 以外の任意の文字に一致する行の後に停止し、その後に A が続きます。 WHAT のように、2A とは異なる任意の 1 桁の A で停止しますが、他のものではありません;そのため、停止条件は ,/line [013-9]A/ かもしれません .
grep を使用するのが最善の方法だと思います cut と組み合わせて と tail .まず、grep を使用して、目的の文字列 (-n) がある行を取得します。 行番号を出力します。 -m 1 最初の一致後に検索を停止するには):
grep -n -m 1 "somestring" filename.txt
これにより、行番号と文字列自体が出力されます。文字列を切り取るには、cut (-f1 :最初のフィールドを出力します。 -d: 区切り文字として「:」を使用):
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
次に、このコマンドの出力を末尾のパラメーターとして使用します。通常、tail は最後の k 行を出力しますが、 -n +k を使用します 、k 行目以降に表示する tail を取得します。コマンドの合計は次のとおりです:
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
somestring までの行を出力するには head を使用 tail の代わりに そして -n -# -n +# の代わりに .両方を組み合わせて、ある文字列から別の文字列までの行を取得することもできます.