次のようなテキスト ファイルがあります。
line 1
line 2A
line 3
line 4A
line 5
「行 2A」からファイルの最後までを「grep」したいのですが、次のようになります。
cat file.txt|some_grep "line 2A"
また、私は「行 2A」から「A」を含む次の行まで「grep」したいのですが、次のようになります。
cat file.txt| some_grep "A"
これを印刷したい:
line 2A
line 3
line 4A
これを実現するにはどのコマンドが役立ちますか?
答え1
(コメントから拡大)
awk
このニーズに完全に一致する行の「範囲」を選択する機能があります。GNU-awk (gawk) マニュアルに記載されている(この機能は他のawk
s でも動作しますが、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 が続く行の後で停止します。これにバリエーションを加えたい場合もあります。たとえば、2A 以外の任意の 1 桁の数字の A で停止し、 のような他の A では停止しないようにしますWHAT
。その場合、停止条件は になります,/line [013-9]A/
。
答え2
「行 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
答え3
最善の方法は、とgrep
を組み合わせて使用することだと思います。まず、 grep を使用して、目的の文字列がある行を取得します (は行番号を出力し、は最初の一致後に検索を停止します)。cut
tail
-n
-m 1
grep -n -m 1 "somestring" filename.txt
これは行番号と文字列自体を出力します。文字列を切り取るには、cut ( -f1
: 最初のフィールドを出力します。-d:
区切り文字として ":" を使用します) を使用します。
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
次に、このコマンドの出力を tail のパラメータとして使用します。通常、tail は最後の k 行を出力しますが、 を使用すると-n +k
、tail は k 行目以降を出力します。コマンド全体は次のようになります。
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
までの行を出力するには、の代わりにとの代わりにsomestring
を使用します。また、両方を組み合わせて、ある文字列から別の文字列までの行を取得することもできます。head
tail
-n -#
-n +#
答え4
以下のコードを試してください -
sed -n '6,$p' infile