2013-02-14 20 views
16

私は確かにgrepコマンドでいくつかの問題があります。複数のファイルでgrep検索の最終行を取得

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

:私はまた、複数の選択したファイル内のgrep検索を行うための方法を見つける

grep PATERN FILE_NAME | tail -1 

私は唯一のgrep検索の最後の行を表示する方法を見つけました今私は各単一のファイルのgrep結果の最後の行を取得したいと思います。

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

これは私がすべてのファイルの最後にマッチした摂餌がしたい最後のファイルの最後の値だけを返します。 私はこれを試してみました。書き込み時にシェルglobingとexpasionで世話をし、

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

「{}」のファイル名です:あなたはあまりにもコマンドを実行するために見つけるに使用できる

答えて

25
for f in $(find . -name "FILE_NAME"); do grep PATERN $f | tail -1; done 
+0

はうまくいきます!ありがとうございました! :D –

+0

残念ながら、ファイル全体を検索して最終結果だけを返すと、これは巨大なファイルや複雑なパターンの検索には効率的ではありませんか?あなたのforループの中で、次のようなものはどうですか? 'tacファイル| grep -m1 -oP '(?<=tag>)。*(?=) '| head -n 1 または grep -m1 -oP(?<=tag>)「<<(tacファイル)」 – kisna

2

これはどのように良い先生について

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

最初のコメントと同じ精神は、完璧に動作します! –

0

コマンド

-1

ループを必要としないソリューションがあり、これはOPが望んでいるものを提供します。 tail -1せずに比較すると

find . -type f -exec sh -c "fgrep print {} /dev/null |tail -1" \; 

./tway.pl:print map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
./txml.py:   print("%s does not exist: %s\n" % (host, error)) 
./utils.py:print combine_dicts(a, b, operator.mul) 
./xml_example.py:print ET.tostring(root, method="text") 

は、ファイルごとにあまりにも多くの行を与えるが、上記の作品を証明しています。

find . -type f -exec sh -c "fgrep print {} /dev/null" \; 

います:

./tway.pl:print map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
./txml.py:   print("%s resolved to --> %s\n" % (host, ip)) 
./txml.py:   print("%s does not exist: %s\n" % (host, error)) 
./utils.py:print "a", a 
./utils.py:print "b", b 
./utils.py:print combine_dicts(a, b, operator.mul) 
./xml_example.py: print ">>" 
./xml_example.py: print ET.tostring(e, method="text") 
./xml_example.py: print "<<" 
./xml_example.py:print ET.tostring(root, method="text") 

EDITからを使用すると、出力に含まれたファイル名を使用しない場合は/ dev/nullをを削除します。

-2

これを行う最も簡単な方法は、ファイルから最後の1行(またはそれ以上)の行を取得し、それを介してgrepすることです。だから、 -

tail -1 filenames.* | grep "what you want to grep for" 
+2

最後の行はパターンと必ずしも一致しないので、ファイルごとの最後の一致を表示します。 –

-1

最後行を見つけるもう一つの方法は、ファイルと出力最初試合を逆転させることです。

find . -name "FILE_NAME" | xargs -I name sh -c 'tac name|sed -n "/PATTERN/{p;q}"' 
0

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

[email protected] /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 = 
関連する問題