grepコマンドを使用して最初の行を印刷する方法は?


16

というファイルがありますfile.txtgrepコマンドを使用して最初の行のみを印刷するにはどうすればよいですか?


4
head -1 file.txt動作しませんか?
clk

@steeldriverは、奇妙に選択されたgrepツールでそれを行う方法なので、答えにする必要があります。
メルバースラン16

1
grepファイルの最初の行を印刷するのに最適なツールではありません。に一致する最初の行を単に印刷したいgrep場合、またはの特定の用途がある場合はgrep、それが何であるかをお知らせください。より多くの文脈があれば、おそらくあなたとコミュニティをよりよく助ける答えを与えることができます。
DKing 16

@MelBurslan file.txtには、たとえば3行あります。これは新しいファイルです。2行目:ファイルの名前はnewFileです3行目:新しい行を作成していません。grepコマンドを使用して、最初の行のみを印刷するにはどうすればよいですか?また、最初の行と最後の行の両方を印刷するにはどのコマンドが役立ちますか?両方の質問に対するコマンドを教えていただけますか?
ニシンサントッシュ

既存の回答のいずれかが問題を解決する場合は、チェックマークでそれを受け入れることを検討してください。ありがとうございました!
ジェフシャラー

回答:


37

これはgrepの型破りなアプリケーションですが、次のようにして使用できます

grep -m1 "" file.txt

空の式が何にでも一致するため機能しますが-m1、最初の一致後にgrepが終了します

-m NUM, --max-count=NUM
       Stop reading a file after NUM matching lines.

チョコレートで覆われたバナナは、私が思ったほど役に立たないことを示すための+1。
カミルマシオロウスキ16

4
それかもしれないが、いくつかのシステム上での作業が、それはポータブルではありません:grep: unknown option -- m
Kusalananda

1
「最初の行」と「一致した最初の行」の違いに注意してください
チャールズ

13

これは何かでgrepはありません。「grep」という名前自体は、「正規表現をグローバルに検索して出力する」の頭字語です。これは、edコマンドg/re/pが(特定の正規表現に対してre)行うことです。

edは1969年のインタラクティブなラインエディタですが、今日でもほとんどの場合システムにインストールされています。我々は持ってgrepからed、それは、特定の機能のショートカットまたはエイリアスとして見ることができるed、とsed。これは。これは、「stream- ed」、つまり(非対話型)ストリームエディターです。

sed代わりに使用しましょう:

$ sed -n '1p' file.txt

1p文字列は、小さなでsed印刷(つまり「スクリプト」p)指定されたアドレスに対応するライン(1最初のライン)。編集コマンド1pは(驚くことではないが)同じことをするedところでエディターでます。

-n我々が得るすべては、ファイルの最初の行であるので、明示的にスクリプトによって印刷されていないものの出力を抑制することができますfile.txt

代わりに:

$ sed '1q' file.txt

これはファイルのすべての行を印刷しますが、終了します(q 1行目(印刷後)で)されます。これは、とまったく同じhead -n 1 file.txtです。

POSIX規格では、(一般化して)それhead -n Nはとほぼ同じですsed 'Nq'(つまり、「すべての行を印刷しますが、行で終了しますN」)。なぜhead標準に含まれていたのかは、対称性tail(および既存のUnix実装との後方互換性)によるものでした。


これが最も明快な答えです。最初の答えは奇妙なハックです。奇妙なものがあることは知っていましたが、grepとedの歴史を教えてくれてありがとう。今ではすべてが理にかなっています。
トマスズビリ

6

最初の行に一意の文字列がない限り、grepのみを使用してこれを行うことはできません。 head -n 1 file.txtその代わりに動作します。

パターンに一致する場合に最初の行のみを印刷する場合は、パイプをgrepにパイプします

head -n 1 * | grep [pattern]


2

Grepのもう1つの型にはまらない使用法- シュワルツ変換は、いくつかの回転を経て行に番号を付け、次にgrepを使用して行番号を探し、行番号を削除します。

function grep1() (
  nlines=$(wc -l < "$1")
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep '^1 ' | sed 's/^1 *//'
)

function greplast() (
  nlines=$(wc -l < "$1")
  nlines=$((nlines + 0))
  nlw=$(printf "%d" "$nlines" | wc -c)
  nl -d '\n' -ba -n ln -w "$nlw" -s ' ' "$1" | grep "^$nlines " | sed "s/^$nlines *//"
)

この回答は、(grep、bash、または...など)で何かを実行できるからといって、そうすべきではないという考えの例としてここに入れています-おそらく、仕事のためのより良いツールがあるでしょう。sedsed 1qまたはsed -n 1p)およびheadhead -n 1)は、ファイルの最初の行を印刷するためのより適切なツールです。ファイルの最後の行を印刷するために、あなたが持っていますtail -n 1sed -n '$p'。これらのツールは単一のコマンドであるだけでなく(上記の機能の3つ以上ではありません)、将来の読者(おそらくあなた自身)にとってもはるかに明確です。-それらが入っているスクリプトの。私はあなたの質問の(現在3人の)ダウン投票者の1人ではありませんが、仕事のための任意のツールに対する(支持する理由なしでの)主張が理由である可能性がありますダウン票。それは持っているシステムがあることは極めてまれだgrepも持っていないheadtailsed

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.