努力将 grep 的输出放入数组中

努力将 grep 的输出放入数组中

请注意,我不是开发人员,但我有一些要求,即尝试在 SVN 存储库中搜索包含某些表名的文件。我根据我在这里读到的许多内容构建了这个脚本。

printf "table_name, file_name, full_path\n" >> export_list.txt
while read table
do
extract=($(egrep -ilrs $table /path/to/file | egrep -i tag | egrep -v backup))
file_name=$(basename $extract)
printf "$table, $file_name, $extract\n" >> export_list.txt
done < table_list.txt

我期待这样的输出

table_name, file_name, full_path
SOMETABLENAME, SomeFileName, /path/to/file/tag1.0/SomeFileName
SOMETABLENAME, SomeFileName, /path/to/file/tag2.0/SomeFileName
SOMETABLENAME, SomeFileName1, /path/to/file/tag1.0/SomeFileName1
SOMETABLENAME, SomeFileName1, /path/to/file/tag2.0/SomeFileName1

相反,我只返回 SOMETABLENAME 的一行,即它找到的第一行。

数组的使用来自 这个帖子。我也读过链接帖子但说实话我不太明白。

如果我的脚本存在其他问题(错误的 grep 等),或者其他更好的方法,我将不胜感激。

编辑:

table_list.txt 有 2000 行,如下所示

BI_CLAIMS_SUMMARY
BI_CLAIMS_SUMMARY_AUDIT
BI_MEDS_AUDIT
BI_MEDS_PATIENTS
BI_MEDS_SUMMARY

编辑:

我已按照 Jessie 下面的建议进行了更改(谢谢),但输出看起来与我尝试使用我的(错误)版本的数组之前非常相似。

table_name, file_name, full_path
BI_CLAIMS_SUMMARY, nohup.out, /sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_claims_sum_plan_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_claims_sum_proc.sql
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/source/10_load_claims_summary_audit_sqlserver.sas
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/resources/automation/nohup.out
BI_CLAIMS_SUMMARY_AUDIT, 10_load_claims_summary_audit_sqlserver.sas, /sas/data/prod/EIP/depot/hiu/data_extract/tags/1.2/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.3/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/data_extract/tags/1.4/source/pl_sql/bi_sum_claims_audit_proc.sql
/sas/data/prod/EIP/depot/hiu/meds/tags/1.0/source/HIU_RISK_REFRESH_CLAIMS_SUMMARY_AUDIT.sas
/sas/data/prod/EIP/depot/hiu/sql_refresh/tags/1.0/source/10_load_claims_summary_audit_sqlserver.sas

我期望 BI_CLAIMS_SUMMARY 出现在每一行上。而且文件名 nohup.out 出现在 file_name 下,因此它没有正确分割 grep 的输出

答案1

首先让我说抱歉,因为我目前不太确定您的问题是什么,但我相信这与您调用数组的方式有关,我有以下建议:

n=0
printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path' >> export_list.txt
while read -r table
do
    extract[$n]=$(egrep -ilrs "$table" /path/to/file | egrep -i tag | egrep -v backup)
    file_name=$(basename "${extract[$n]}")
    printf '%s,%s,%s\n' "$table" "$file_name" "${extract[$n]}" >> export_list.txt
    n=$((n+1))
done < table_list.txt
  1. 格式printf字符串应始终与实际内容分开。 ( printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path')
  2. 使用时read你几乎应该总是使用-r参数。这将允许它将转义字符读取\为文字
  3. 总是双引号你的变量。因为
  4. 引用数组/数组元素时必须使用特殊语法。即${array[@]}(整个数组)或${array[0]}(数组中的第一个元素)。当您调用它时,$array您将始终只获得第一个元素。
  5. 由于上述原因,我们需要一种方法来确保我们在每次迭代中获取正确的数组元素。为此,我添加了n变量,该变量将在循环的每次迭代中递增。

注意:这里似乎根本不需要使用数组。除非您的代码继续extract在其他地方使用,否则您可以简单地将其设置为变量并在循环的每次迭代中重置它。

另请注意:您的问题被标记为“shell-script”,但 POSIX 标准未指定数组,因此虽然大多数 /bin/sh 版本支持它们,但不能保证您的版本也支持它们。

相关内容