进出口多个值,从而创建一个SSH grep命令, 我有三个项目的文本文件..bash命令使用RHEL6下的bash使用从文本文件
{text file}
lel
jts
sld
希望找到最短的脚本/单线命令来生成一个单一的ssh命令,以减少的次数我访问机器
{end result}
ssh [email protected] "grep -e lel -e jts -e sld {filename}"
进出口多个值,从而创建一个SSH grep命令, 我有三个项目的文本文件..bash命令使用RHEL6下的bash使用从文本文件
{text file}
lel
jts
sld
希望找到最短的脚本/单线命令来生成一个单一的ssh命令,以减少的次数我访问机器
{end result}
ssh [email protected] "grep -e lel -e jts -e sld {filename}"
#!/bin/bash
set -eu
txtFile1="$1"
txtFile2="$2"
grepCmd="grep"
for i in $(cat $txtFile1); do
grepCmd="$grepCmd -e $i"
done
ssh [email protected] "$grepCmd $txtFile2"
执行像:
个./script "text file" "filename"
ssh [email protected] egrep '\|lel\|jts\|sld' {filename}
对SSH命令行参数来转义,因为得到扩展两次
ssh [email protected] egrep "$(readarray -t t<file1; printf "%s" "${t[0]}"; printf -- "\|%s" "${t[@]:1}")" file2
其中文件1是你的{文本文件}和file2是其他{文件名}上远程机器
如果远程计算机有牛羚的grep(也许即使有一些其他的grep),你可以使用-f -
从标准输入一次读取正则表达式模式之一:
ssh [email protected] grep -f - {filename} < {patterns.txt}
(注:< {patterns.txt}
是为ssh
命令你的机器上的重定向。不要引用它把它作为命令的一部分。)
通过ssh
构建用于远程执行的命令总是有点脆弱,因为实际上ssh
传递命令(或彼此之间的单个空格字符级联命令参数一个)作为单个字符串,使用-c
选项在远程计算机上的用户的外壳。这意味着您需要认真思考如何引用参数,以防可能有必要。当传递的参数来自其他地方时,这尤其令人讨厌,就像你的情况一样:如果文件的行包含空白或shell元字符,那么你需要安排适当的转义行,以便远程shell将会正确解释它们。
Bash的内置printf
实用程序包含%q
格式的代码,这对于构建这样的命令行非常有用。例如,下面的应该安全地引用文件中包含的模式:
ssh [email protected] "grep $(
while IFS= read -r; do
printf -- "-e %q " "$REPLY"
done < {patterns.txt}) {filename}"
另外,作为一个可能更具可读性两班轮:
mapfile -t patterns < {patterns.txt}
ssh [email protected] "grep $(printf -- "-e %q " "${patterns[@]}") {filename}"
给你一定的灵活性,你可以使用下面的AWK的解决方案,只是产生的命令进行打印:
$ awk -v n="[email protected]" -v f="filename" '\
{a=((a)?a:"") " -e" $1}END{printf "ssh %s \"grep %s %s\"\n", n, a, f}' text
ssh [email protected] "grep -elel -ejts -esld filename"
如果,但是,有兴趣的实际执行你的ssh,并抓住了输出,你需要这样的事:
$ cat tst.awk
{a=((a)?a:"") " -e" $1} # build up list of "-e ..."
END{
cmd="ssh " n " \"grep " a " " f "\"" # concatenate cmd with vars "n" and "f"
r=((cmd|getline line) > 0 ?line:"") # execute cmd. check for errors.
print r # print result r
close(cmd) # close the cmd
}
,你可以调用诸如:
awk -v n="[email protected]" -v f="filename" -f tst.awk text
或作为一个班轮:
$ awk -v n="[email protected]" -v f="filename" '{a=((a)?a:"") " -e" $1}END{cmd="ssh " n " \"grep " a " " f "\"";r=((cmd|getline line) > 0 ?line:"");print r;close(cmd)}' text
您可以在bash脚本中使用它,循环使用多个机器和文件。你唯一需要做的就是用你的resp替换n
和f
变量。 bash vars。
这并不让我到远程机器并执行使用所有这三个文件中的价值观对我的本地盒 – Frank
啊道歉grep的,我会补充说 – ericcurtin
它是否适合你现在的工作...或者你是否也必须提供ssh密码? – ericcurtin