【问题标题】:Recursive search using awk command使用 awk 命令进行递归搜索
【发布时间】:2020-10-06 14:18:00
【问题描述】:

我有 100 个日志文件,我希望 awk 在给定时间戳之间递归搜索给定模式。 日志文件看起来像这样

2010-03-24 07:00:01 ZZZZC941948879 RUFFLES 222.222.222.222 GET / - 80 - 220.181.7.113 HTTP/1.1       
2010-03-24 07:00:23 ZZZZC941948879 RUFFLES 222.222.222.222 GET 

代码是

 awk -v "b=$date1" -v "e=$date2" '$1 >= b && $1 <= e' log.txt > output
 grep -i "21things" output

我可以搜索模式,但只能搜索单个文件。是否可以使用 awk 命令进行递归搜索?

感谢您的帮助..!!

【问题讨论】:

  • 使用 find ... | xargs awk ... 将所有日志传递给 awk
  • 你能澄清一下这里的“递归”是什么意思吗?看起来您可能只是想在一堆文件上运行 awk 命令。另外,当日志文件中没有逗号时,为什么要使用-F ','?请编辑您的问题,以更清楚地说明您要做什么。

标签: bash recursion awk


【解决方案1】:

如果您的日志都在同一个目录中,请使用 shell 通配符:

awk -v "b=$date1" -v "e=$date2" '$1 >= b && $1 <= e' *.log

注意 awk 可以做 grep 做的事情,所以你不需要临时文件:

awk -v "b=$date1" -v "e=$date2" -v patt="21things" '
    $1 >= b && $1 <= e && tolower($0) ~ patt
' *.log

如果您有 GNU awk,请使用 -v IGNORECASE=1 并删除 tolower 函数。

【讨论】:

  • 我一直使用-v b="$date1",但它似乎也适用于你的方式。
【解决方案2】:

您可以使用 find 命令递归地遍历目录中的所有文件并将文件传递给 awk。以下将显示发生匹配的所有文件。更改为所需的:

find . -type f -exec awk '/<PATTERN>/{print FILENAME; nextfile}' '{}' \;

以下将打印出与文件名匹配的所有行:

find . -type f -exec awk '/<PATTERN>/{print FILENAME ":\t" $0;}' '{}' \;

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2010-09-20
    • 2012-01-30
    • 2018-07-08
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多