我正在尝试获取某些日志的日期,以某种格式进行一些比较,这是我的命令:
fgrep "<expression>" <logFile> | sort | awk -F "[][]" 'messageDate=$(date -d "$2" "+%Y.%j.%H.%M.%S") { print messageDate }'
我打印的是日志文件的完整行。
如果我运行这个:
fgrep "<expression>" <logFiles> | sort | awk -F "[][]" 'messageDate=$(date -d "$2" "+%Y.%j.%H.%M.%S") { print $2 }'
我得到了日期但不是我想要的格式。
2014-09-04T08:22:16Z
2017-10-08T16:05:06Z
2022-11-30T14:50:16Z
日志文件包含如下消息:
[2022-11-30T14:50:16Z] <Info/Warning/Error>: <log message>
有谁明白为什么 awk 可以工作,这意味着它正确地分割文件,但是代码messageDate=$(date -d "$2" "+%Y.%j.%H.%M.%S")
以某种方式再次获取完整的日志消息?
关于“bash awk 命令” - bash 和 awk 是两个完全不同的工具。您可以从 bash 调用 awk,也可以从 awk 调用 bash,就像您可以从 bash 调用 C 程序或 perl 脚本,反之亦然,但每个工具都有自己独立的语言、范围等。
当你写下:
您尝试在 awk 脚本中使用 bash 语法,但这不太可能像尝试在 C 程序中使用 bash 语法那样起作用。
date
要调用像from 这样的 Unix 实用程序awk
(通过诸如 之类的中间 shellbash
)并将结果存储在 awk 变量中,然后在操作成功时打印结果(正如您在脚本中尝试执行的操作),可以使用任何 awk 执行此操作:有关我如何使用的更多信息,请参阅http://awk.freeshell.org/AllAboutGetline(或者,如果它不可用,请参阅https://web.archive.org/web/20221109201352/http://awk.freeshell.org/AllAboutGetline
getline
) 。但是,如果您使用的是 GNU awk,它有自己的内置时间函数,因此您可以执行以下操作:
这比 awk
date
每输入一行就生成一个 shell 来调用一次要快几个数量级。您可以尝试这个解决方案:
请注意,您不需要这样做
grep
,因为当它在一行中awk
找到文本时,也可以只打印那些列。expression