awk 从文件中搜索字符串

awk 从文件中搜索字符串

我目前正在使用

 $ awk 'NR==FNR{a[$1];next} ($3 in a)' find.txt path_to_100_files/*

它使用 find.txt 字符串在 path_to_100_files/ 中搜索多个文件以查找匹配项。

find.txt 包含

[email protected]
[email protected]

然后 path_to_100_files/ 包含文件,例如

0.0.0.0:002921931:[email protected]
123.0.0.1:00029382:[email protected]

现在它所做的只是在第三列中搜索 find.txt 中的字符串,但我需要它来搜索整个文件/每一列?

因为某些文件可能有 5 列长,或 9 列长,例如,

0.0.0.0:002921931:1111111:[email protected]
123.0.0.1:00029382:1111111:11111:[email protected]

我尝试将 (a 中的 $3) 更改为 (a 中的 $0-$9) 但似乎不起作用?

答案1

为什么要一一搜索字段?为什么不一次搜索整行呢?

grep -f find.txt path_to_100_files/*

答案2

如果电子邮件是 100 个文件中的最后一个字段,请使用:

awk -F: 'NR==FNR{a[$1];next} ($NF in a)' find.txt path_to_100_files/*

如果您必须查看每个字段,则需要一个循环:

awk -F: 'NR==FNR{a[$1];next} {for (i=1;i<=NF;i++) {if ($i in a) {print;break}}} find.txt path_to_100_files/*

但更简单的调用是使用 grep:

grep -oFf find.txt path_to_100_files/*

答案3

首先使用以下命令查找文件中存在的最大列并从中获取最大值

k=`awk -F ":" '{print NF}'  path_to_100_files/*  | sort -nr | head -1`

使用 for 循环来检查每一列

for ((i=0;i<=$k;i++)); do awk -v i="$i" -F ":" 'NR==FNR {a[$1];next}($i in a) {print }’   find.txt path_to_100_files/*   ; done

相关内容