進出口多個值,從而創建一個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