here文档中的shell脚本用作ssh的输入,但没有结果

问题描述 投票:0回答:2

我正在将grep的结果传递到AWK,并将结果用作EOF中另一个grep的模式(不确定那里的术语是什么),但是AWK给了我空白的结果。以下是给我一些问题的bash脚本的一部分。

ssh "$USER"@logs << EOF
  zgrep $wgr $loc$env/app*$date* | awk -F":" '{print $5 "::" $7}' | awk -F"," '{print $1}' | sort | uniq | while read -r rid ; do
  zgrep $rid $loc$env/app*$date*;
done
EOF

我真的在这里画了一个空白,因为没有错误,而且我没有想法。

样品:

我正在查看如下所示的日志文件:

app-server.log.2020010416.gz:2020-01-04 16:00:00,441 INFO [redacted] (redacted) [rid:12345::12345-12345-12345-12345-12345,...

我对rid感兴趣,我可以再次在日志中重复该代码:

zgrep $rid $loc$env/app*$date*

locenvdate正常工作,但它们不在EOF范围内。

脚本作为一个整体连接到ssh并正常退出,但是我没有任何结果。

awk grep eof
2个回答
0
投票

[请您试一下。公平的警告,由于缺少样本,我无法对其进行测试。通过这种方法,我们不需要在执行ssh时就逃脱。

##Configure/define your shell variables(wgr, loc, env, date, rid) here.
printf -v var_wgr %q "$wgr"
printf -v var_loc %q "$loc"
printf -v var_env %q "$env"
printf -v var_date %q "$date"

ssh -T -p your_pass user@"$host" "bash -s $var_str" <<'EOF'

# retrieve it off the shell command line
zgrep "$var_wgr $var_loc$var_env/app*$var_date*" | awk -F":" '{print $5 "::" $7}' | awk -F"," '{print $1}' | sort | uniq | while read -r rid ; do
zgrep "$rid $var_loc$var_env/app*$date*";
done
EOF

0
投票

直接的问题是美元符号由本地外壳程序评估,因为您没有(并且可能无法)引用此文档(因为外壳程序也不会扩展$wqr$loc等) 。

快速的解决方法是反斜杠美元符号,但除此之外,我看到了一些摆脱不雅或浪费的构造的机会。

ssh "$USER"@logs << EOF
  zgrep "$wgr" "$loc$env/app"*"$date"* |
  awk -F":" '{v = \$5 "::" \$7; split(v, f, /,/) print f[1]}' |
  sort -u | xargs -I {} zgrep {} "$loc$env"/app*"$date"*
EOF
© www.soinside.com 2019 - 2024. All rights reserved.