Sam*_*Sam 2 command-line grep awk text-processing files
我有一个目录,其中包含以下样式的日志:
info.log00001
info.log00002
info.log00003
...
info.log09999
info.log
Run Code Online (Sandbox Code Playgroud)
我需要分析偶尔发生的特定错误的频率,因此请转到该目录并使用以下内容grep -crw . -e "FooException BarError" | sort -n | less
获取:
./info.log00001: 1
./info.log00002: 0
./info.log00003: 42
...
./info.log09999: 25
./info.log: 0
Run Code Online (Sandbox Code Playgroud)
然后,我可以ls -lt
查看他们的修改日期并分析错误发生最多的时间。
无论如何,我想找到一种方法来在同一行中获得计数和日期的输出。这将使我的分析更容易。我想要的东西是:
2015-09-31 10:00 ./info.log00001: 1
2015-09-31 10:15 ./info.log00002: 0
2015-09-31 10:30 ./info.log00003: 42
...
2016-04-01 13:20 ./info.log09999: 25
2015-09-31 13:27 ./info.log: 0
Run Code Online (Sandbox Code Playgroud)
理想情况下,我只想用一个命令来完成这个,但首先将grep
的输出扔到一个文件,然后处理该文件也可以。
另外,我真的不关心日期格式或者日期是在行尾还是在行首。我想要的只是让文件按日期排序,从最旧的开始(这也是名称中数字最小的文件)
我找到了一种方法来完成与 类似的事情awk
,但在我的情况下它不起作用,因为它从grep
的输出解析文件名,在我的情况下,grep
的输出有更多的文本,只是文件的路径。
我真的很感激对此的任何反馈。
如果您有gnu find
- 并且假设您的文件名都不包含换行符 - 您可以使用find
's-printf
以mtime
所需格式输出+ 文件名,然后运行grep
以获取计数:
find . -type f -printf '%TY-%Tm-%Td %TH:%TM %p: ' -exec grep -cw "whatever" {} \; | sort -k1,1 -k2,2
Run Code Online (Sandbox Code Playgroud)
或者,zsh
您可以对修改时间进行 glob 和排序(通过glob 限定符-.
选择常规文件,Om
按mtime降序排序),然后为每个文件打印mtime
使用stat
模块、文件名,然后再次通过以下方式获取计数grep
:
zmodload zsh/stat
for f in ./**/*(.Om)
do
printf '%s %s\t%s %s: ' $(zstat -F '%Y-%b-%d %H:%M' +mtime -- $f) $f
grep -cw "whatever" $f
done
Run Code Online (Sandbox Code Playgroud)