我想使用 ssh 进行远程并执行 grep 命令进行模式搜索。
使用下面的脚本但它不起作用。请建议。
read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
答案1
你的代码:
read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
- 可能
read
应该read -r -p ... pattern
这样才能正确读取反斜杠。 - 目前尚不清楚您是否将其用作
hostname
实际主机名(我认为)的占位符,或者您是否认为这host
将获得执行该实用程序的值hostname
。 - 最后一行有一个未终止的单引号字符串。即使最后以单引号终止,变量
$pattern
也不会因为单引号而扩展。这cd
是不必要的。变量$host
扩展需要引用,并且命令行标志应位于主机名之前(但在本例中-t
不需要)。
建议:
read -r -p "please enter the pattern:" pattern
host=hostname
ssh "$host" find /path -type f -name "'*.gz'" -exec zgrep -e "'$pattern'" /dev/null {} '\;' | grep -F 'Status=completed;'
此处的命令find
将查找远程主机上的所有*.gz
文件,并用于查找这些文件中的模式。然后结果由最后一个进一步(本地)过滤。我不确定是否应该成为最后一个模式的一部分。如果不应该存在,请将其删除。/path
zgrep
$pattern
grep
;
需要使用"'*.gz'"
and进行时髦的引用。"'$pattern'"
本地 shell 在调用 之前去掉第一层引号,为远程端的命令ssh
留下'*.gz'
和'...'
(无论 的值$pattern
是什么) 。find
我们zgrep ... /dev/null ...
确保zgrep
始终会收到至少两个文件(/dev/null
以及 来自 的另一个文件/path
),以便匹配文件的文件名将出现在其输出中。
grep -F
会将给定字符串视为固定字符串而不是正则表达式。它在这里既可以作为文档,也可以加快处理速度。