web-dev-qa-db-ja.com

複数のファイルのgrep検索から最終行を取得

現在、grepコマンドに何らかの問題があります。

Grep検索の最後の行のみを表示する方法を見つけました:

grep PATERN FILE_NAME | tail -1

また、選択した複数のファイルでgrep検索を行う方法も見つけました。

find . -name "FILE_NAME" | xargs -I name grep PATERN name

ここで、各ファイルのgrep結果の最終行のみを取得したいと思います。私はこれを試しました:

 find . -name "FILE_NAME" | xargs -I name grep PATERN name | tail -1

これにより、すべてのファイルで最後に一致するパターンを取得する最後のファイルの最後の値のみが返されます。

23
B.jour
for f in $(find . -name "FILE_NAME"); do grep PATERN $f | tail -1; done
32
Daniel Frey

この良い先生はどうですか

find . -name "FILE_NAME" -print0 | while read -d '' aa
do
  grep PATTERN "$aa" | tail -1
done
3
Steven Penny

findを使用してコマンドを実行することもできます。

find . -name "<file-name-to-find>" -exec grep "<pattern-to-match>" "{}" ";" | tail -1

「{}」はファイル名です。コマンドを記述するときは、シェルのグロビングと拡張に注意してください

1
Augusto Hack

これの代わりに、grepの代わりにawkを使用することもできます。 Posixバージョンは次のようになります。

awk '(FNR==1)&&s{print s; s=""}/PATTERN/{s=$0}END{if(s) print s}' file1 file2 file3 ...

GNU awkを使用すると、ENDFILEを使用できます

awk 'BEGINFILE{s=""}/PATTERN/{s=$0}ENDFILE{if(s) print s}' file1 file2 file3 ...
0
kvantour

Grepの-B(前)パラメーターで開始できます。たとえば、一致する前に5行を取得するには:

duli@i5 /etc/php5/Apache2 $ grep -i -B5 timezone php.ini 
[CLI Server]
; Whether the CLI web server uses ANSI color coding in its terminal output.
cli_server.color = On

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
0
duli

各ファイルの最後の行を取得します(ファイル名を接頭辞として付けます)。次に、パターンに基づいて出力をフィルタリングします。

find . -name "*" -exec tail -v -n1 {} \; | grep "some_string" -B1

macOSでは、少し異なる方法で行う必要があります

find . -name "*" | xargs tail -1 | grep "some_string" -B1
0
Oo.oO