「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 +#
の代わりに .両方を組み合わせて、ある文字列から別の文字列までの行を取得することもできます.