用于查看日志并替换输出中的某些字符的别名

Alias to watch a log and replace some characters in output

我需要在 .bashrc 中创建一个别名,以每 1000 秒打印一次日志的最后十行,并在输出中替换一些字符(每个“\s”为一个 space)。

我正在合并两个不同的别名:

alias watch10='watch '

alias dcr='-n 1000 \'tail -10  some.log | sed "s/\s/\ /g"\''

将别名添加到 .bashrc 后,我 运行 "source .bashrc" 没有收到任何错误。

日志行如下所示:

somestuff /B/R/Joe\sPaul\s-\sMike\s-\sSteve

我希望输出行是:

somestuff /B/R/Joe Paul - Mike - Steve

我通过组合两个别名在 ssh 中调用命令:

watch10 dcr

这会产生一个错误:

sh: 1: dcr: not found

解决方法是什么?

请注意,当我使用此别名(而不是 dcr)时它会起作用,它不会尝试将烦人的“\s”替换为单个 spaces:

alias dc="-n 1000 'tail -10  some.log'"

谢谢。

即使用反斜杠转义也不能嵌套单引号。

解决方法是:

  • 用单引号关闭子字符串。
  • 输入 \' 表示文字单引号。
  • 然后用单引号重新开始剩余的子字符串。

例如,您可以使用以下方式打印 "That's it.":

echo 'That'\''s it.'

不用说用 双引号(如果适用)。

回到你的问题,请尝试:

alias dcr='-n 1000 '\''tail -10 some.log | sed "s/\\s/ /g"'\'

请注意,您需要另一个反斜杠来转义 \s

但是为什么不将这两个别名合并为一个:

alias dcr='watch -n 1000 '\''tail -10 some.log | sed "s/\\s/ /g"'\'

(可能有一些具体原因...)

希望对您有所帮助。

无法连接别名。别名替换仅在简单命令的第一个标记上执行。当您键入 'alias1 alias2' 时,假设 alias1=cmd1 alias2=cmd,代码将执行 'cmd1 alias2'(alias2 假定为文字参数)。

这个问题做的假设很少,我无法在 Mint19 上验证

  • 将 2 个别名(watch10、dcr)放入 .bashrc 有效:Mint19 生成“未终止的引用字符串”)。
  • 同样将 dc 设置为 '-n 1000 'tail -10 some.log'" 并将其与 'watch10 dc' 一起使用。我相信这将导致 运行 宁 'dc' (/usr/bin/dc) 程序(基本计算器),而不是采用 dc 选项。

几个选项:

如果您希望其他程序使用 'dcr' 命令(在本例中为 watch),请编写一个小脚本,并将其放在 PATH 中引用的个人文件夹中(例如〜/ bin)。请注意,使用脚本将简化设置“\s”替换的过程。

替代方法是创建组合 'wdcr' 别名,组合为 'watch -n 1000 \'tail -10 some.log ...`。

  • 运行 通过 ssh

当您使用命令 运行 '.ssh' 远程主机时,它被视为登录会话,而不是交互式会话。它将来源'~/.bash_profile'。除非配置文件脚本引用 ~/.bashrc,否则您不会在远程会话中获得别名。

另请注意,bash 强烈反对除交互式会话之外的任何别名,支持函数。