machineB
Ich 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
machineB
Ich 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
wordsToInclude
Das bedeutet, dass ich Wörter in der Variable durch Kommas getrennt habe . Wenn meine Protokolle hello
Wörter enthalten, drucken Sie diese Zeile aus und drucken Sie auch die Zeile aus, die animal
Wörter enthält. Gleiches gilt für Wörter attribute
und metadata
Wö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 wordsToInclude
einer wordsToExclude
Variablen 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 -F
Funktion 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, grep
um -f
diese 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 grep
Eindruck 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 $wordsToInclude
und wandelt die Kommas in Zeilenendezeichen ( ,
-> ) um. Diese Liste von Wörtern wird dann über den Schalter \n
eingespeist .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 -t
verhindert 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'
-F
Und zu den Optionen von grep hinzufügen .