2017-10-17 15 views
1

イム、 私は3つのエントリを持つテキストファイルを持っている...bashコマンド

{text file} 
lel 
jts 
sld 

が最短スクリプトを見つけるために探してシングル/ sshコマンドを生成するために、単一の行のコマンドは、回数を減らすために、私は、実行マシン

{end result} 
ssh [email protected] "grep -e lel -e jts -e sld {filename}" 

答えて

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

これは私のローカルマシン上のファイル内の3つの値すべてを使ってリモートマシンにgrepを実行しません – Frank

+0

ああ、お詫びします、それを追加します – ericcurtin

+0

これはあなたのために今働きますか...あなたもsshのパスワードを提供する必要がありますか? – ericcurtin

0
ssh [email protected] egrep '\|lel\|jts\|sld' {filename} 

2回

file1があなたの{テキストファイル}であるとfile2が上の他の{ファイル名}である
ssh [email protected] egrep "$(readarray -t t<file1; printf "%s" "${t[0]}"; printf -- "\|%s" "${t[@]:1}")" file2 

を展開しますので、SSHのコマンドラインの引数は、エスケープする必要がありますリモートマシン

0

リモートマシンが(それはいくつかの他のgrepを持っている場合でも、多分と)ヌーのgrepを持っている場合は、標準入力から一度に正規表現パターンを1つずつ読み取るために-f -を使用することができます。

ssh [email protected] grep -f - {filename} < {patterns.txt} 

< {patterns.txt}sshコマンドのリダイレクトです。

sshでリモート実行用のコマンドを作成するのは、実際にはコマンドを渡すためです(または、各コマンド引数の間に1つのスペース文字を連結したコマンド引数を渡すため)。 1つ)を、リモートマシン上のユーザーのシェルに単一の文字列として、-cオプションを使用して追加します。これは、必要に応じて、引数を引用する方法について懸命に考える必要があることを意味します。ファイルの行に空白またはメタ文字が含まれている場合、リモートシェルが適切にエスケープされるように行をアレンジする必要があります。それらを正しく解釈する。

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" 

あなたは、しかし、実際に興味がある場合

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 
あなたのよう呼び出すことができます

$ 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 
} 

あなたのsshを実行し、出力をつかん、あなたはこのような何かをする必要があります

これはbashスクリプトで使用でき、複数のマシンとファイルをループします。唯一必要なことは、nfの変数をあなたのrespに置き換えることです。 bash vars。