Shell

本地/遠端

  • May 31, 2019

我想實時從 SNMP 記錄器中獲取相關行並將它們移動到我的應用程序伺服器進行檢查。下半場很好,scp正在做戲。前半段讓我有些悲傷。

我想要做的是檢查三個最新的日誌文件中的相關消息。所以我會這樣做: [user@SNMPServer]$ cd /var/opt/OV/log/nnm/; files=ls -t | grep -m 3 trap.csv; echo $files

trap.csv trap.csv.2019-05-31_07_00_01 trap.csv.2019-05-31_06_00_01

這很好,因為我隨後計劃:

[user@SNMPServer]$ grep $ipAddress $files

當我在 SNMP 伺服器上執行它時,它再次執行良好。

當我從我的虛擬機執行此操作時,

admin@alarmux:~$sudo ssh p210243@192.75.110.40 "cd /var/opt/OV/log/nnm/; files=ls -t | grep -m 3 trap.csv; echo $files"

我得到這個輸出:

assets bash: testerlog: command not found bash: count.txt: command not found

這些是ls -t我的虛擬機主目錄的結果,而不是遠端的。我在某處缺少轉義字元嗎?

反引號並$( … )在雙引號內插入。使用單引號,它會工作。

sudo ssh p210243@192.75.110.40 'cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files'

或者使用 xargs 完全避免子外殼:

sudo ssh p210243@192.75.110.40 'ls -td /var/opt/OV/log/nnm/* | grep -m 3 trap.csv | xargs grep '$ipAddress

使用zshshell,具有最近修改時間戳的三個文件,文件名*trap.cvs/var/opt/OV/log/nnm目錄中匹配,將具有模式

/var/opt/OV/log/nnm/*trap.cvs(.om[1,3])

where(...)修改前面模式的行為。 .僅選擇正常文件(不是目錄名稱等)並om通過減少修改時間戳來排序。[1,3]僅返回前三個匹配項(如果匹配項較少,則返回更少)。

因此,如果您zsh在遠端機器上安裝了 shell,您就可以做到

ssh p210243@192.75.110.40 zsh -c 'grep -wF "$1" /var/opt/OV/log/nnm/*trap.cvs(.om[1,3])' zsh "$ipAddress"

這將啟動grep以查找保存在$ipAddress遠端系統上三個最近修改的文件中的 IP 地址。

with 使用的標誌grep使它使用字元串比較而不是正則表達式匹配(that’s -F),並且它要求匹配的字元串是一個完整的單詞(that’s -w; 所以 that123.123.123.123不匹配23.123.123.1)。

引用自:https://unix.stackexchange.com/questions/522137