約1000行のファイルがあります。 grepステートメントに一致する行の後のファイルの一部が必要です。
つまり.
$ cat file | grep 'TERMINATE' // Its found on line 534
そのため、さらに処理するために535 to line 1000
行のファイルが必要です。
どうすればいいのですか ?
簡単な近似として、使用できます
grep -A100000 TERMINATE file
TERMINATE
を取得し、その行に続く最大100000行を出力します。
マニュアルページから
-A NUM, --after-context=NUM
一致する行の後に末尾コンテキストのNUM行を印刷します。隣接する一致グループの間にグループ区切り文字(-)を含む行を配置します。 -oまたは--only-matchingオプションでは、これは効果がなく、警告が表示されます。
ここで使用するツールはawkです。
cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1} {if (found) print }'
これはどのように作動しますか:
他のソリューションは、非常に大きなファイルで使用すると、多くのメモリを消費する可能性があります。
次のようなbashパラメーター展開を使用します。
content=$(cat file)
echo "${content#*TERMINATE}"
あなたの質問を正しく理解しているなら、行afterTERMINATE
が必要です。TERMINATE
- lineは含まれていません。 awk
は簡単な方法でこれを行うことができます。
awk '{if(found) print} /TERMINATE/{found=1}' your_file
説明:
if(found) print
)は最初から何も出力しません。これにより、すべての行が出力されます後 the TERMINATE
- line。
一般化:
例:
$ cat ex_file.txt
not this line
second line
START
A good line to include
And this line
Yep
END
Nope more
...
never ever
$ awk '/END/{found=0} {if(found) print} /START/{found=1}' ex_file.txt
A good line to include
And this line
Yep
$
説明:
found
が設定されている場合、現在の行を印刷します。found=1
を設定して、次の行が出力されるようにします。このチェックが行われることに注意してくださいafter結果からstart-lineを除外する実際の印刷。ノート:
BEGIN{found=0}
を追加できます。grep -A 10000000「TERMINATE」ファイル
何らかの理由でsedの使用を避けたい場合、次のコマンドはTERMINATE
に一致する行をファイルの最後まで出力します。
tail -n "+$(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)" file
そして、以下はTERMINATE
に一致する次の行からファイルの最後まで印刷されます。
tail -n "+$(($(grep -n 'TERMINATE' file | head -n 1 | cut -d ":" -f 1)+1))" file
Sedが1つのプロセスで実行できることを行うには2つのプロセスが必要です。grepの実行とtailの実行中にファイルが変更されると、結果が不整合になる可能性があるため、sedの使用をお勧めします。さらに、ファイルdonesにTERMINATE
が含まれていない場合、最初のコマンドは失敗します。
sed
またはawk
でそれを行うには多くの方法があります。
sed -n '/TERMINATE/,$p' file
これは、ファイル内でTERMINATE
を探し、その行からファイルの最後まで出力します。
awk '/TERMINATE/,0' file
これは、sed
とまったく同じ動作です。
印刷を開始する行の番号がわかっている場合は、NR
(最終的に行の番号を示すレコードの数)と一緒に指定できます。
awk 'NR>=535' file
$ seq 10 > a #generate a file with one number per line, from 1 to 10
$ sed -n '/7/,$p' a
7
8
9
10
$ awk '/7/,0' a
7
8
9
10
$ awk 'NR>=7' a
7
8
9
10
これは、それを行う1つの方法です。ファイルのどの行にgrep Wordがあり、ファイルに何行あるかがわかっている場合:
grep -A466 'TERMINATE'ファイル
Jfgagneによる優れたsed
の回答に代わるもので、一致する行が含まれていません。
awk '/TERMINATE/ {y=1;next} y'
( https://stackoverflow.com/a/18166628 )awk '/TERMINATE/ ? c++ : c'
( https://stackoverflow.com/a/23984891 )Perl -ne 'print unless 1 .. /TERMINATE/'
( https://stackoverflow.com/a/18167194 )