web-dev-qa-db-ja.com

セクションから始めるにはGrepの助けが必要です

コードの一部をgrepしたいテキストファイルがいくつかあります。私が達成しようとしている目標は、特定の行でビューを開始し、その下にあるものを読むことができるようにすることです。例えば。以下のテキストでは、黄色の開始点でテキストファイルを表示するにはどうすればよいですか。そのコンテンツが何であるかに関係なく、「黄色」のコンテンツとその下にあるすべてのコンテンツを表示したい。

green
blue
cyan
Magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
8
john smith

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()
9

あなたはそれをすることができます:

awk '/yellow/{f=1}f' file

ここで、「file」はテキストを含むファイル名です。

5
Pilot6

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
5
kos

パーティーに遅れて:)

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は、リストの要素を結合して文字列として出力します

5
heemayl

質問はviewingファイルを参照しているため、常に良いol 'があります

less +/yellow file
4
steeldriver