【问题标题】:How to access logs using sed that is in a remote server using ssh?如何使用 sed 访问使用 ssh 的远程服务器中的日志?
【发布时间】:2018-06-18 19:33:41
【问题描述】:

我正在尝试使用sed 命令给它一个正则表达式来过滤掉属于给定时间戳的日志。如果日志文件存在于我的脚本执行的同一服务器中,我能够实现它。这对我有用 -

sed -n '/2018-01-07 19/,/2018-01-07 22:1[4-9]/p' /var/opt/xyz/Logs/ErrorLog_2.txt`. 

此命令过滤掉与给定正则表达式匹配的日志。但是,当日志文件位于远程服务器中时,就会出现复杂性。我尝试运行此命令 -

ssh dbsrd3511.uhc.com `sed -n '/2018-01-07 19/,/2018-01-07
22:1[4-9]/p' /var/opt/xyz/Logs/ErrorLog_2.txt  

但是会报错

 ksh: 2018-01-07:not found

但是当我像这样在sed 之前添加echo 时效果很好 -

ssh dbsrd3511.uhc.com echo `sed -n '/2018-01-07 19/,/2018-01-07 22:1[4-9]/p' /var/opt/xyz/Logs/ErrorLog_2.txt`

但是 echo 连接了所有内容。输出看起来像这样 -

40:09.146 Info: Deleted 13 MB at 1037 MB/sec /var/opt/MarkLogic/Forests/Meters/00002786 2018-01-07 21:40:09.148 Info: Deleted 9 MB at 3366 MB/sec /var/opt/MarkLogic/Forests/Meters/00002785 2018-01-07 21:52:00.893 Info: Saving /var/opt/MarkLogic/Forests/Meters/00002787 2018-01-07 21:52:02.039 Info: Saved 9 MB in 1 sec at 8 MB/sec to /var/opt/MarkLogic/Forests/Meters/00002787 2018-01-07 21:52:02.062 Info: Merging 73 MB from /var/opt/MarkLogic/Forests/Meters/00002783, /var/opt/MarkLogic/Forests/Meters/00002788, and /var/opt/MarkLogic/Forests/Meters/00002787 to /var/opt/MarkLogic/Forests/Meters/0000278a, timestamp=15153829212255230 2018-01-07 21:52:11.668 Info: Merged 71 MB in 10 sec at 7 MB/sec to /var/opt/MarkLogic/Forests/Meters/0000278a 2018-01-07 21:52:14.065 Info: Deleted 52 MB at 3235 MB/sec /var/opt/MarkLogic/Forests/Meters/00002783 2018-01-07 21:52:14.088 Info: Deleted 17 MB at 721 MB/sec /var/opt/MarkLogic/Forests/Meters/00002788 2018-01-07 21:52:14.105 Info: De

我无法区分换行。有没有办法可以得到正确的结果?

好的!到目前为止,我可以运行这个命令ssh dbsrd3511.uhc.com 'sed -n "/2018-01-07 21/,/2018-01-07 22:1[4-9]/p" /var/opt/MarkLogic/Logs/ErrorLog_3.txt',但问题是这些是硬编码的值。实际上,日期和日志文件存储在变量中,所以我在执行这个命令时收到错误 - ssh dbsrd3511.uhc.com 'sed -n "$dateRange" $error_log_file_name'。它在连接到远程服务器时挂起。它不返回任何输出,只是在连接到远程服务器时挂起。

【问题讨论】:

    标签: bash shell ssh sed echo


    【解决方案1】:

    您可能希望将-t 选项与ssh 一起使用。手册页说

    -t      Force pseudo-terminal allocation.  This can be used to execute
            arbitrary screen-based programs on a remote machine, which can be
            very useful, e.g. when implementing menu services.  Multiple -t
            options force tty allocation, even if ssh has no local tty.
    

    你的情况应该是这样的

    ssh -t dbsrd3511.uhc.com 'sed -n "/2018-01-07 19/,/2018-01-07 22:1[4-9]/p"
    /var/opt/xyz/Logs/ErrorLog_2.txt'
    

    注意:了解如何使用引号 - 单引号作为包装器,双引号用于 sed 命令

    【讨论】:

      【解决方案2】:

      为了避免引用和逃避噩梦,您可以简单地这样做:

      ssh -t dbsrd3511.uhc.com cat /var/opt/xyz/Logs/ErrorLog_2.txt | sed -n '/2018-01-07 19/,/2018-01-07 22:1[4-9]/p'
      

      这会在您的本地系统上运行sed 进程,而不是远程运行。

      (可能可以忽略不计)的缺点是整个日志文件都通过您的ssh 频道传输,但如果它不是很大(即千兆字节或更大),那应该不是主要问题。

      【讨论】:

      • 这个文件可以是 tera 字节。
      【解决方案3】:

      哦!这最终对我有用。

      ssh dbsrd3511.uhc.com "sed -n '$dateRange' $error_log_file_name
      

      这也对我有用 -

      ssh dbsrd3511.uhc.com "sed -n '/2018-01-07 21/,/2018-01-07 22:1[4-9]/p' /var/opt/MarkLogic/Logs/ErrorLog_3.txt"
      

      【讨论】:

        【解决方案4】:

        在版本 9 中,有一个 REST 端点,可以从集群中的任何服务器检索日志文件,通过日期范围和正则表达式的任意组合进行搜索。 无需“ssh”到远程服务器,访问集群中任何节点上的 ML 就足够了。

        【讨论】:

          猜你喜欢
          • 2020-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-23
          • 2018-06-12
          • 1970-01-01
          • 2019-03-18
          • 1970-01-01
          相关资源
          最近更新 更多