【问题标题】:How would you create a terminal alias to watch the latest log file update in real time? [duplicate]您将如何创建终端别名来实时查看最新的日志文件更新? [复制]
【发布时间】:2019-06-28 20:34:31
【问题描述】:

情况:我想要一个可以提取最新日志(每小时更新一次)并观察它变化的单行命令。这是一个可能解释不那么晦涩的尝试:

tail -500f $(ls | grep PackageName | sort | tail -1)

上述方法实际上有效,但是当我为其创建别名时,它不会更新 $(~~~) 值。谁能给个理由?

所以,再一次尝试(这个问题的重点):

ls | grep PackageName | sort | tail -1 | tail -500f (LogFileNameTimeStampLatest)

原来它只是从最后一个管道(LogFileNameTimeStampLatest)输出结果。这也是有道理的,因为这就是倒数第二个管道命令(tail -1 首先要做的)

我想了解如何使用上一个管道的输出来指向下一个管道中的文件(而不仅仅是 LogFileName)。具体来说,如何将一个管道的输出用作另一个管道的参数?

【问题讨论】:

  • 定义别名时,是用单引号还是双引号括起来?你想要单引号;双引号会给出您描述的结果。但函数通常比别名好(参见@tripleee 的回答)。
  • 使用别名有哪些取舍?
  • 别名适用于非常简单的快捷方式(例如alias ll='ls -l'),但对于任何不平凡的事情,函数是要走的路。有关更多讨论和差异,请参阅this AskUbuntu question

标签: bash command-line terminal pipe zsh


【解决方案1】:

不要创建别名。创建一个函数。

watchlog () {
    tail -500f "$(ls *PackageName* | sort | tail -1)"
}

如果输出包含本身包含 shell 元字符(包括任何空格)的文件名,则双引号是必需的。

可能有避免use of ls in a script 的好方法,但简单的解决方案是不要尝试将其放入别名中。

同样的命令可以改写为xargs,我猜这就是你最后要问的:

ls *PackageName* | sort | tail -1 |
xargs tail -500f

【讨论】:

  • 嗨!我按照您的建议按照您的建议创建了一个函数。但是,该命令不会针对随后几个小时内形成的日志进行自我更新。我不知道哪个参数或参数我做得不对。
  • 感谢xargs 的提示!目前我的方法看起来像:eplog() { tail -500f "$(cd /deploy/var/env/SummerEndWebsite/output/logs/ && find SummerEndWebsite* | sort | tail -1)" }
  • cd 看起来很奇怪,如果在错误的目录中运行它会不会停止工作?最好做find /deploy/var/env/etc -maxdepth 1 -name 'SummerEndWebsite*' | sort | tail -n 1
  • 'cd' 看起来很奇怪我知道,我只是希望能够cd 也能进入那个目录,所以我选择这样写。可以像您提到的那样使用find,而永远不需要cd。另外,cd 有一个绝对路径,所以我不确定更改目录会如何影响它的行为。
  • 这就是我的意思,find 的输出将引用与外部tail 运行的目录不同的目录,因此您将得到“找不到文件”。
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 2011-10-13
  • 1970-01-01
  • 2020-08-23
  • 2011-11-12
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
相关资源
最近更新 更多