grep --before-context 5
は、一致する前の5行を示します。
試合前に全部見せたい。
やっているgrep --before-context 99999999
は機能しますが、あまり専門的ではありません。
試合までのすべてのファイルを表示するにはどうすればよいですか?
Sed の方が適しています。
ただやる:
sed '/PATTERN/q' FILE
それはこのように動作します:
各行について、/PATTERN
と一致するかどうかを確認します。
PATTERN
を検出するとすぐに終了するため、これは最も効率的なソリューションです。 q
がない場合、sedはファイルの残りの部分を読み取り続け、何もしません。大きなファイルの場合、違いが生じる可能性があります。
このトリックは、head
をエミュレートするためにも使用できます。
sed 10q FILE
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
マッチまで印刷します:
awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename
一致するものを含めずに最大で印刷:
awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
日常業務で基本的なツールのみを覚えて、エレガントで効率の低いソリューションを受け入れようとする人のために:
head -n $(grep -n pattern filename | cut -d: -f1) filename
このコマンドがスクリプト用である場合、よりエレガントな(そしておそらく効率的な)ソリューションを探します。これが1回限りのコマンドまたは使い捨てスクリプトである場合、私は気にしません。
上記のミケルの答えに追加...
FILE
を含むPATTERN
の最初の行までを含むが、含まないまでのすべての行を印刷するには、次のコマンドを試してください。
sed '/.*PATTERN.*/{s///;q;}' FILE
これは、パターンを含む行全体と一致し、それを空白行に置き換えて、ファイルの残りの部分を処理せずに終了します。
ポストスクリプト:
(別のツールを使用せずに)最後に余分な改行が出力されないようにするために考えられる最も簡単で明確な方法は、もう一度sedを実行して新しい最後の行を削除することでした。
sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'
...そしてとにかくその行を削除しているので、以前の作業は冗長であり、次のように簡略化できます。
sed '/PATTERN/q' FILE | sed '$d'
次の純粋なGNU grep
メソッドは効率的ではありません。
文字列「foo」のfirstインスタンスまでのすべてを検索ファイルbar、3つのgrep
sを使用:
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) 。
次のいずれかを使用することもできます
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
など