我想实时从 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
)。