使用 grep 过滤命令内容

使用 grep 过滤命令内容

我正在尝试过滤掉 ssh-keyscan 的输出。这样做的目的是过滤输出,以便我可以在我的 python 代码中使用它来识别连接到我的 VPN 的主机。通常我会使用 grep 进行过滤,我的一个 grep 过滤正确,但另一个没有。第一个 grep 正在努力获取 ed25519 ID,但不确定为什么我还得到了 SSH-2.0... 行。我运行的命令以及输出如下:

user@host# ssh-keyscan 10.xx.xx.xx | grep ed25519 | grep -v "#"
  # 10.xx.xx.xx:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.3
  # 10.xx.xx.xx:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.3
  # 10.xx.xx.xx:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.3
  # 10.xx.xx.xx:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.3
  # 10.xx.xx.xx:22 SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.3
  10.xx.xx.xx ssh-ed25519 <host key>

我需要它只打印 ed25519 行。我也尝试过用 AWK 进行过滤,但仍然没有得到我需要的输出。

知道如何仅过滤 ed25519 行吗?

答案1

以 开头的行将#发送到 stderr(标准错误)而不是标准输出 (stdout)。要grep -v排除它们,您需要将 stderr 重定向到 stdout:

ssh-keyscan 10.xx.xx.xx 2>&1 | grep ed25519 | grep -v "#"

请注意,您可以通过向 ssh-keyscan 命令本身添加类型过滤器来消除第一个 grep:

ssh-keyscan -t ed25519 10.xx.xx.xx 2>&1 | grep -v "#"

如果愿意,您可以将所有错误重定向为 null,而不是对其进行过滤:

ssh-keyscan -t ed25519 10.xx.xx.xx 2>/dev/null

答案2

好吧,如果您知道输出将包含“ssh-ed25519”,那么您应该对其进行 grep。

或者通过管道传输至该处。

或者如果您知道它将是输出的最后一行,请通过管道传输到适当的“tail”命令。

你看过 sed 命令吗?

相关内容