我想即時從 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 [email protected] "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
我的虛擬機主目錄的結果,而不是遠端的結果。我是否在某處缺少轉義字元?
答案1
反引號並$( … )
在雙引號內插入。使用單引號就可以了。
sudo ssh [email protected] 'cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files'
或使用 xargs 完全避免使用子 shell:
sudo ssh [email protected] 'ls -td /var/opt/OV/log/nnm/* | grep -m 3 trap.csv | xargs grep '$ipAddress
答案2
使用zsh
shell,具有最近修改時間戳記且檔案名稱在目錄*trap.cvs
中匹配的三個檔案/var/opt/OV/log/nnm
將具有以下模式
/var/opt/OV/log/nnm/*trap.cvs(.om[1,3])
其中(...)
修改前面模式的行為。 .
僅選擇常規檔案(不選擇目錄名稱等)並om
透過減少修改時間戳進行排序。僅返回[1,3]
前三個匹配項(如果匹配項較少,則返回更少)。
因此,如果您zsh
在遠端電腦上安裝了 shell,您將能夠執行以下操作
ssh [email protected] zsh -c 'grep -wF "$1" /var/opt/OV/log/nnm/*trap.cvs(.om[1,3])' zsh "$ipAddress"
這將啟動grep
查找$ipAddress
遠端系統上三個最近修改的檔案中保存的 IP 位址。
使用的標誌grep
使其使用字串比較而不是正則表達式匹配(即-F
),並且它要求匹配字串是完整單字(即-w
; 因此123.123.123.123
與 不匹配23.123.123.1
)。