在 Unix 中如何仅在目录中的几个文件中搜索字符串
Posted
技术标签:
【中文标题】在 Unix 中如何仅在目录中的几个文件中搜索字符串【英文标题】:In Unix how to search string only in few files in directory 【发布时间】:2015-07-03 19:37:03 【问题描述】:我需要在我的日志文件夹中查找名为“Account_Id”的字符串。但是,那里有 10000 个日志文件,我只需要在过去 30 天创建的文件中搜索它。
我需要在 csv 文件中这样的输出。这只是一个例子
File_name Matched_string Line
program1.log where account_id1 14
program2.log substr(account_id,1,4) 45
我确实尝试过使用grep -nHi "Account_Id" *
但是它会搜索整个目录并花费大量时间
非常感谢任何帮助
【问题讨论】:
看看find
命令
grep files based on time stamp 的可能重复项
【参考方案1】:
DIRECTORY=logs
echo -e "File_name\tMatched_string\tLine"
for i in $(find $DIRECTORY -ctime -30)
do
grep -nHIs "Account_Id" $i | awk -F ":" 'print $1"\011" $3 "\011" $2'
done
由于制表符对齐问题,我不确定您是否会得到问题中指定的输出
更新
在当前目录中启动的 Oneliner。它使用find -exec
和awk printf
。可能你需要调整 printf 格式("%-40s\t%-40s\t%-4s\n"
):
find . -ctime -30 -exec grep -nHIs "Account_Id" \; | awk -F ":" 'BEGIN printf "%-40s\t%-40s\t%-4s\n" , "File_name", "Matched_string", "Line" printf "%-40s\t%-40s\t%-4s\n", $1, $3, $2' > out.csv
【讨论】:
【参考方案2】:grep -Hin Account_Id find * -mtime -30
|awk -F":" 'print $1 "\t" $3"\t" $2' >> xyz.csv
如果您有特定模式中的文件名,那么您可以在 find 中添加该模式,如下所示
grep -Hin Account_Id find program* -mtime -30
|awk -F":" 'print $1 "\t" $3"\t" $2' >> xyz.csv
注意:我不知道为什么倾斜符号从我的 cmets 中消失了 确保在上述命令中的单词查找之前和 -30 之后放置倾斜(键盘按钮下面的 Esc)。
【讨论】:
以上是关于在 Unix 中如何仅在目录中的几个文件中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章
我如何在linux / unix / bash脚本中搜索文件中的十六进制内容?
Powershell仅在包含特定字符串的文件夹名称中移动子目录中的项目