イム、 私は3つのエントリを持つテキストファイルを持っている...bashコマンド
{text file}
lel
jts
sld
が最短スクリプトを見つけるために探してシングル/ sshコマンドを生成するために、単一の行のコマンドは、回数を減らすために、私は、実行マシン
{end result}
ssh [email protected] "grep -e lel -e jts -e sld {filename}"
イム、 私は3つのエントリを持つテキストファイルを持っている...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}
2回
file1があなたの{テキストファイル}であるとfile2が上の他の{ファイル名}であるssh [email protected] egrep "$(readarray -t t<file1; printf "%s" "${t[0]}"; printf -- "\|%s" "${t[@]:1}")" file2
を展開しますので、SSHのコマンドラインの引数は、エスケープする必要がありますリモートマシン
リモートマシンが(それはいくつかの他の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}"
をあなたが次を使用することができ、いくつかの柔軟性を与えるために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スクリプトで使用でき、複数のマシンとファイルをループします。唯一必要なことは、n
とf
の変数をあなたのrespに置き換えることです。 bash vars。
これは私のローカルマシン上のファイル内の3つの値すべてを使ってリモートマシンにgrepを実行しません – Frank
ああ、お詫びします、それを追加します – ericcurtin
これはあなたのために今働きますか...あなたもsshのパスワードを提供する必要がありますか? – ericcurtin