パターン検索のためにSSHを使用してリモートでgrepコマンドを実行したいと思います。
以下のスクリプトを使用しましたが、動作しません。提案してください。
read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
答え1
あなたのコード:
read -p "please enter the pattern:" pattern
host=hostname
ssh $host -t 'cd /path ; zgrep $pattern *| grep Status=completed;
- おそらくバックスラッシュを正しく読むためにこれを行う
read
必要があります。read -r -p ... pattern
- これを実際のホスト名のプレースホルダとして使用しているか(私の考えでは)これがユーティリティを実行するための値を取得すると
hostname
思うかどうかはわかりません。host
hostname
- 最後の行には、終わらない一重引用符文字列があります。一重引用符で終わっても、一重引用符は
$pattern
変数を拡張しません。これはcd
不要です。変数$host
拡張には引用符が必要で、コマンドラインフラグはホスト名の前になければなりません(ただし、-t
この場合はそうではありません)。
提案:
read -r -p "please enter the pattern:" pattern
host=hostname
ssh "$host" find /path -type f -name "'*.gz'" -exec zgrep -e "'$pattern'" /dev/null {} '\;' | grep -F 'Status=completed;'
ここのコマンドは、find
リモートホスト上のすべてのファイルを検索し、*.gz
そのファイル内のパターンを見つけるために使用されます。結果は最後の結果に基づいてさらに(ローカルに)フィルタリングされます。これが最後のパターンの一部になるべきかどうかはわかりません。そこにいない場合は削除してください。/path
zgrep
$pattern
grep
;
"'*.gz'"
スタイリッシュな引用には使用が必要です。"'$pattern'"
ローカルシェルは、呼び出し前に最初のレベルの引用符を削除し、リモート側のコマンドにand(値が何でも)をssh
残します。'*.gz'
'...'
$pattern
find
一致するファイルのファイル名が出力に表示されるように、常に2つ以上のファイル(および他の1つのファイル)を受信していることを確認してくださいzgrep ... /dev/null ...
。zgrep
/dev/null
/path
grep -F
与えられた文字列を正規表現ではなく固定文字列として扱います。文書化と処理速度を向上させるためにここにあります。