2017-10-17 77 views

回答

0
#!/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" 
+0

這並不讓我到遠程機器並執行使用所有這三個文件中的價值觀對我的本地盒 – Frank

+0

啊道歉grep的,我會補充說 – ericcurtin

+0

它是否適合你現在的工作...或者你是否也必須提供ssh密碼? – ericcurtin

0
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是其他{文件名}上遠程機器

0

如果遠程計算機有牛羚的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}" 
0

給你一定的靈活性,你可以使用下面的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替換nf變量。 bash vars。