在 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 -execawk 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脚本中搜索文件中的十六进制内容?

如何在Unix下使用sed命令

Powershell仅在包含特定字符串的文件夹名称中移动子目录中的项目

C#中String类的几个方法(IndexOfLastIndexOfSubstring)

从多个压缩文件夹中搜索多个 .csv 文件中的字符串

unix高手的几个习惯