コードの一部をgrepしたいテキストファイルがいくつかあります。私が達成しようとしている目標は、特定の行でビューを開始し、その下にあるものを読むことができるようにすることです。例えば。以下のテキストでは、黄色の開始点でテキストファイルを表示するにはどうすればよいですか。そのコンテンツが何であるかに関係なく、「黄色」のコンテンツとその下にあるすべてのコンテンツを表示したい。
green
blue
cyan
Magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
AWKAWK
を使用-これは取得できる最も簡単な方法です。
awk '/yellow/,0' textfile.txt
サンプル実行
$ awk '/yellow/,0' textfile.txt
yellow
red
orange
more orange
more blue
this is enough
Grep
grep
を--after-context
オプションとともに使用して、一致後の特定の行数を印刷することもできます
grep 'yellow' --after-context=999999 textfile.txt
コンテキストの自動設定には、$(wc -l textfile.txt)
を使用できます。基本的な考え方は、一致する最初の行があり、その一致後にすべてを印刷する場合、ファイルの行数から1を引いた値を知る必要があるということです。幸運なことに、--after-context
はスローされません行数に関するエラー。そのため、完全に範囲外の番号を与えることができますが、それがわからない場合は、行の総数が
$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough
コマンドを短くしたい場合は、--after-context
は-A
および$(wc -l textfile.txt)
と同じオプションで、行数に続いてファイル名に展開されます。そのため、textfile.txt
を1回だけ入力します
grep "yellow" -A $(wc -l textfile.txt)
Python
skolodya@ubuntu:$ ./printAfter.py textfile.txt
yellow
red
orange
more orange
more blue
this is enough
DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py
#!/usr/bin/env python
import sys
printable=False
with open(sys.argv[1]) as f:
for line in f:
if "yellow" in line:
printable=True
if printable:
print line.rstrip('\n')
または、printable
フラグなし
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if "yellow" in line:
for lines in f: # will print remaining lines
print lines.rstrip('\n')
exit()
あなたはそれをすることができます:
awk '/yellow/{f=1}f' file
ここで、「file」はテキストを含むファイル名です。
grep
ではなく、sed
を使用:
sed -n '/^yellow$/,$p' file
-n
:印刷を禁止します/^yellow$/,$
:yellow
に完全に一致する行の最初の出現から最後の行までを含むアドレス範囲p
:アドレス範囲の行を出力します% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough
パーティーに遅れて:)
grep
を使用:
grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
-P
を使用すると、Perl互換の正規表現を使用できます
-z
は、改行ではなくASCII NULで区切られた入力ファイルを作成します
-o
は必要な部分のみを取ります
(?s)
はDOTALL修飾子であり、トークン.
(任意の文字)を使用して改行を照合できます。
\n\K
では、\n
は改行と一致し、\K
は一致を破棄します
yellow\n.*
はyellow
に一致し、その後に改行が続き、これ以降もすべて選択され、出力に表示されます。
例:
% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough
少しのpython
を使用:
#!/usr/bin/env python2
with open('file.txt') as f:
lines = f.readlines()
print ''.join(lines[lines.index('yellow\n'):])
lines
は、ファイルのすべての行を含むリストです(末尾の改行も含む)
lines.index('yellow\n')
は、yellow\n
が見つかったlines
の最低インデックスを提供します
lines[lines.index('yellow\n'):]
はリストのスライスを使用して、yellow\n
から始まる部分を終了まで取得します
join
は、リストの要素を結合して文字列として出力します
質問はviewingファイルを参照しているため、常に良いol 'があります
less +/yellow file