Alias,用于监视日志并替换输出中的某些字符



我需要在.bashrc中创建一个别名,以每1000秒打印日志的最后十行,并在输出中替换一些字符(每个"\s"用一个空格(。

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

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

在将别名添加到.bashrc之后,我运行"source.bashrc",并且没有得到任何错误。

日志行如下所示:

somestuff /B/R/JoesPauls-sMikes-sSteve

我希望输出线路是:

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

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

watch10 dcr

这会产生一个错误:

sh: 1: dcr: not found

解决方案是什么?

请注意,当我使用这个别名(而不是dcr(时,它是有效的,它不会试图用单个空格替换恼人的"\s":

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

谢谢。

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

解决方法是:

  • 用单引号关闭子字符串一次
  • 放入代表文字单引号的'
  • 然后用单引号重新启动剩余的子字符串

例如,您可以使用打印"就这样">

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 上验证

  • 将两个别名(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'。除非配置文件脚本为~/.bahrc,否则您将无法在远程会话中获得别名。

还要注意,bash强烈反对使用除交互式会话之外的任何别名,而支持函数。

最新更新