回答:
試すことができます
grep pattern file | tail -1
または
tac file | grep pattern | head -1
または
tac file | grep -m1 pattern
grep -n
実際のファイルで行番号()を取得したいという制約が追加されたため、でtac
減算を行いたくない限り、ほとんど回避する必要があると思いますwc -l
。それ以外の場合tac
はgrep -m1
、非常に理にかなっています。
grep
、最初の試合後に機能しなくなるため、はるかに優れています。を使用しない-m 1
場合、grep
最初にファイル内のすべての一致するパターンが検出され、次に最初のパターンhead
のみが表示されます。デニス、これを別の回答に投稿することを検討してください!
Unix / Linux / Mac / Cygwinで巨大なテキストファイルを扱う人向け。Windowsを使用している場合、WindowsのLinuxツールについてhttps://stackoverflow.com/questions/3519738/what-is-the-best-way-to-use-linux-utilities-under-windowsを確認してください。
このワークフローに従って、優れたパフォーマンスを実現できます。
zq
パッケージからインデックス付きファイルを照会します。githubのreadmeから引用:
インデックスを作成する
zindexは、各行のどの部分がインデックスを構成するかを通知する必要があります。これは、正規表現、フィールド、または外部プログラムを介して各行をパイピングすることにより実行できます。
デフォルトでは、zindexはfile.gzにインデックスを付けるように求められたときにfile.gz.zindexのインデックスを作成します。
例:
数値の正規表現に一致する行にインデックスを作成します。キャプチャグループは、インデックスを作成するパーツを示し、オプションは各行に一意の数値インデックスがあることを示します。
$ zindex file.gz --regex 'id:([0-9]+)' --numeric --unique
例:CSVファイルの2番目のフィールドにインデックスを作成します。
$ zindex file.gz --delimiter , --field 2
例:
ドキュメントルートのアクション配列内の任意のアイテムのJSONフィールドorderId.idにインデックスを作成します(jqが必要です)。jqクエリは、すべてのorderId.idの配列を作成し、それらをスペースで結合して、jqにパイプされる個々の行が、スペースで区切られた複数の一致(デフォルトのセパレーター)で単一行の出力を作成するようにします。
$ zindex file.gz --pipe "jq --raw-output --unbuffered '[.actions[].orderId.id] | join(\" \")'"
インデックスのクエリ
zqプログラムは、インデックスのクエリに使用されます。圧縮ファイルの名前とクエリのリストが与えられます。例えば:
$ zq file.gz 1023 4443 554
行番号で出力することも可能であるため、ファイルから1行目と1000行目を印刷します。
$ zq file.gz --line 1 1000
私は常に猫を使用しています(しかし、これは少し長くなります): cat file | grep pattern | tail -1
私は、大学でLinuxの管理者で猫を愛する教師を非難します:))))
-ファイルをgrepする前に最初にcatする必要はありません。grep pattern file | tail -1
また、より効率的です。
cat
、ファイルに移動してにパイプする必要がないからですgrep
。Cakemoxの答えのように、grep
経由でファイルを直接検索することができますgrep pattern file
(そしてtail
、最後の結果を返すために使用します)。
tac file | grep -m 1 pattern