web-dev-qa-db-ja.com

マッチまでのすべてのファイルを表示

grep --before-context 5は、一致する前の5行を示します。

試合前に全部見せたい。
やっているgrep --before-context 99999999は機能しますが、あまり専門的ではありません。

試合までのすべてのファイルを表示するにはどうすればよいですか?

78
Nicolas Raoul

Sed の方が適しています。

ただやる:

sed '/PATTERN/q' FILE

それはこのように動作します:

各行について、/PATTERNと一致するかどうかを確認します。

  • はいの場合は、印刷して終了します
  • それ以外の場合は印刷します

PATTERNを検出するとすぐに終了するため、これは最も効率的なソリューションです。 qがない場合、sedはファイルの残りの部分を読み取り続け、何もしません。大きなファイルの場合、違いが生じる可能性があります。

このトリックは、headをエミュレートするためにも使用できます。

sed 10q FILE
104
Mikel

sedは、grepのほとんどの機能を置き換えることができます。

sed -n '1,/<pattern>/ p' <file>

つまり、最初の行からパターンが一致するまで印刷します。

範囲の例

sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
39
forcefsck

マッチまで印刷します:

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename

一致するものを含めずに最大で印刷:

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
39
glenn jackman

日常業務で基本的なツールのみを覚えて、エレガントで効率の低いソリューションを受け入れようとする人のために:

head -n $(grep -n pattern filename | cut -d: -f1) filename

このコマンドがスクリプト用である場合、よりエレガントな(そしておそらく効率的な)ソリューションを探します。これが1回限りのコマンドまたは使い捨てスクリプトである場合、私は気にしません。

1
lesmana

上記のミケルの答えに追加...


FILEを含むPATTERNの最初の行までを含むが、含まないまでのすべての行を印刷するには、次のコマンドを試してください。

  • sed '/.*PATTERN.*/{s///;q;}' FILE

これは、パターンを含む行全体と一致し、それを空白行に置き換えて、ファイルの残りの部分を処理せずに終了します。


ポストスクリプト:

(別のツールを使用せずに)最後に余分な改行が出力されないようにするために考えられる最も簡単で明確な方法は、もう一度sedを実行して新しい最後の行を削除することでした。

sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'

...そしてとにかくその行を削除しているので、以前の作業は冗長であり、次のように簡略化できます。

sed '/PATTERN/q' FILE | sed '$d'
1
Jim Grisham

次の純粋なGNU grepメソッドは効率的ではありません。

文字列「foo」のfirstインスタンスまでのすべてを検索ファイルbar、3つのgrepsを使用:

grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar

last」インスタンスまでの「foo」のマッチング:

grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar

注:最後のgrepの詳細は、次の場所にあります。 必要な複数行検索の正規表現(grep)

1
agc

次のいずれかを使用することもできます

tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac 

または

tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac

または

tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac

最初のオプションは、OPが提案したものと非常に似ていますが、ファイル内の行を数えることにより、コンテキストの前に十分な行を表示するようにしています。

2番目のオプションは、最初の一致の行番号を検索し(内部の「ヘッド」を変更することによっても変更できます)、その番号にヘッドを使用します。

最後のオプションは、すべての新しい行を一致で置き換え、次に2つの隣接する一致を新しい行で置き換えます。この出力は、2つの一致の間のすべてのテキストブロックの行です。その後、「head」を使用して最初の行(最初の一致までテキストのブロックを拡大)の一致を選択し、各一致を新しい行に再変換します。このオプションは、ファイルが次の形式の場合にのみ機能します

pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern 
texttexttext
texttexttexttexttexttexttexttexttext

など

0
user122778