it-swarm.com.de

letzte Zeile von der grep-Suche in mehreren Dateien abrufen

Ich habe momentan Probleme mit einem Grep-Befehl.

Ich habe den Weg gefunden, nur die letzte Zeile einer Grep-Suche anzuzeigen: 

grep PATERN FILE_NAME | tail -1

Ich finde auch die Möglichkeit, eine grep-Suche in mehreren ausgewählten Dateien durchzuführen:

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

Jetzt möchte ich nur die letzte Zeile des grep-Ergebnisses für jede einzelne Datei erhalten. Ich habe folgendes versucht: 

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

Dies gibt mir nur den letzten Wert der letzten Datei zurück, wo ich für jede Datei den letzten übereinstimmenden Namen haben möchte.

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

Wie wäre es mit diesem guten Herrn?

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

Eine Alternative dazu könnte mit awk anstelle von grep erfolgen. Eine Posix-Version würde lauten:

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

Mit GNU awk können Sie ENDFILE verwenden

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

Sie könnten mit dem Parameter grep -B (vor) beginnen. Zum Beispiel, um 5 Zeilen vor dem Match zu erhalten:

[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 =
0
duli

Liefert die letzte Zeile jeder Datei (mit vorangestelltem Dateinamen). Filtern Sie dann die Ausgabe anhand des Musters.

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

auf macOS muss man das etwas anders machen

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

sie können find auch verwenden, um Befehle auszuführen:

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

"{}" ist der Dateiname. Achten Sie beim Schreiben des Befehls auf das Glätten und Löschen von Shell

0
Augusto Hack