Wie führe ich ein Grep auf einem Remotecomputer aus und drucke die Zeile aus, die diese Wörter enthält?

Wie führe ich ein Grep auf einem Remotecomputer aus und drucke die Zeile aus, die diese Wörter enthält?

machineBIch habe in diesem Verzeichnis einige Protokolldateien, /opt/ptd/Logs/wie unten gezeigt – Meine Protokolldateien sind ziemlich groß.

david@machineB:/opt/ptd/Logs$ ls -lt
-rw-r--r-- 1 david david  49651720 Oct 11 16:23 ptd.log
-rw-r--r-- 1 david david 104857728 Oct 10 07:55 ptd.log.1
-rw-r--r-- 1 david david 104857726 Oct 10 07:50 ptd.log.2

machineBIch versuche, ein allgemeines Shell-Skript zu schreiben, das alle meine Protokolldateien nach einem bestimmten Muster analysiert und die Zeile mit diesen Mustern ausgibt. Ich werde mein folgendes Shell-Skript ausführen machineA, das alle SSH-Schlüssel enthält, sodass ich von Maschine A aus remote auf die Protokolldateien auf Maschine B zugreifen muss.

#!/bin/bash

wordsToInclude="hello,animal,atttribute,metadata"
wordsToExclude="timeout,runner"

# now grep on the various log file for above words and print out the lines accordingly

wordsToIncludeDas bedeutet, dass ich Wörter in der Variable durch Kommas getrennt habe . Wenn meine Protokolle helloWörter enthalten, drucken Sie diese Zeile aus und drucken Sie auch die Zeile aus, die animalWörter enthält. Gleiches gilt für Wörter attributeund metadataWörter.

Und ich werde in der Variable auch durch Kommas getrennte Wörter haben wordsToExclude. Wenn eine der Zeilen diese Wörter enthält, werden diese Zeilen nicht gedruckt.

Ich verwende zum Speichern der Wörter vorerst das obige Format, aber jedes bessere Format ist für mich in Ordnung. Ich kann lange Listen mit Wörtern in wordsToIncludeeiner wordsToExcludeVariablen haben, deshalb speichere ich sie in diesen Variablen.

Ich weiß, wie man ein Grep auf einem kleinen Variablensatz ausführt. Wenn ich ein Grep von der Befehlszeile direkt auf Maschine B ausführen muss, dann mache ich es so -

grep -E 'hello|animal|atttribute|metadata' ptd.log | grep -v 'timeout'

Ich bin jedoch nicht sicher, wie ich dies in mein Shell-Skript kombiniere, sodass ich von MaschineA aus ein Remote-SSH-Grep auf MaschineB durchführen kann.

Antwort1

Wenn Sie für andere Formate offen sind, ziehen Sie Folgendes in Betracht:

inc="hello|animal|atttribute|metadata"
exc="timeout|runner" 
ssh machineB "grep -E '$inc' path/ptd.log | grep -vE '$exc'"

Schnellere Alternative

Wenn Ihre Protokolldateien groß sind und Sie nach festen Wörtern statt nach ausgefallenen regulären Ausdrücken suchen, sollten Sie diesen Ansatz in Betracht ziehen:

inc='hello
animal
atttribute
metadata'

exc='timeout
runner'

ssh office "grep -F '$inc' ptd.log | grep -vF '$exc'"

Indem wir jedes Wort in eine separate Zeile setzen, können wir die -FFunktion von grep für feste Zeichenfolgen verwenden. Dadurch wird die Verarbeitung regulärer Ausdrücke deaktiviert, was den Prozess beschleunigt.

Antwort2

Es mag unmöglich erscheinen, aber Sie können die Option von verwenden, grepum -fdiese Liste von Wörtern zu verwenden, auch wenn sie sich in einer Umgebungsvariable und nicht in einer richtigen Datei befinden. Der Trick besteht darin, den grepEindruck zu erwecken, dass sie aus einer Datei stammen, wie dieser:

$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") file1 file2 file3'

grep ...Dadurch wird der Befehl remote über auf Maschine B ausgeführt ssh. Es übernimmt Ihre Variable $wordsToIncludeund wandelt die Kommas in Zeilenendezeichen ( ,-> ) um. Diese Liste von Wörtern wird dann über den Schalter \neingespeist .grep-f

Um dies über die Ausschlussliste auszuführen, fügen Sie es einfach als zweites Grep nach dem ersten über eine Pipe hinzu.

$ ssh machineB 'grep -f <(echo $wordsToInclude|tr , "\n") \
    file1 file2 file3 | grep -vf <(echo $wordsToExclude)'

Antwort3

SSH wird mit einem Befehl wie dem folgenden ausgeführt:

ssh host command

Oder in Ihrem Fall:

ssh -t machineB "grep -E \"$wordsToInclude\" ptd.log | grep -v \"$wordsToExclude\""

Das -tverhindert einen „ioctl-Fehler“. Ich würde auch empfehlen, die festen Wörter von grep zu verwenden, um die Geschwindigkeit zu erhöhen, wie angegeben durchdiese Antwortvon @John1024. Setzen Sie einfach jedes Wort in eine eigene Zeile, etwa:

wordsToInclude='hello
animal
atttribute
metadata'

wordsToExclude='timeout
runner'

-FUnd zu den Optionen von grep hinzufügen .

verwandte Informationen