本地/远程ls

本地/远程ls

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

使用zshshell,具有最近修改时间戳且文件名在目录*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)。

相关内容