【问题标题】:Bash script - perform grep on filenames containing particular numbers [duplicate]Bash 脚本 - 对包含特定数字的文件名执行 grep [重复]
【发布时间】:2018-04-08 03:19:29
【问题描述】:

我有一堆文件,例如:

jobReports/NARX_20191212_1.out
jobReports/NARX_20191212_10.out
jobReports/NARX_20197695_2.out
jobReports/NARX_20197695_3.out
jobReports/NARX_20261798_1.out

其中第一个数字序列表示jobID,第二个数字序列表示arrayID。

我想对该目录中的所有.out 文件执行搜索,其中jobID 等于2019769520261798

在命令行中,这是有效的:

grep "Saving results to" jobReports/NARX_{20197695,20261798}*.out | wc -l

,它为我提供了该字符串在所需文件中的出现次数。在我的脚本中,我有以下内容:

#!/bin/bash
myJobs = ( 20197695, 20261798 )
IFS=, eval 'myJobs_string="${myJobs[*]}"'
echo $(grep "Saving results to" jobReports/NARX_{$myJobs_string}*.out |wc -l)

运行时出现错误:

grep: jobReports/NARX_{: No such file or directory
grep: 20197695: No such file or directory
grep: }*.out: No such file or directory

所以看起来在脚本内部,大括号扩展没有像我预期的那样工作......我可以做些什么来解决这个问题?

【问题讨论】:

  • 为什么要评估?为什么不jobReports/NARX_{${myJobs[@]}}*.out
  • 为什么 myJobs 是一个数组而不是一个简单的变量“{20197695, 20261798}”
  • 您不能在大括号内使用变量进行大括号扩展。当您这样做时,',' 将失去所有意义,而只是字符串的一部分。只需遍历您的数组并为每个数组成员保留sum 的行,从而产生您的grep ... | wc -l
  • @kyodev 好点,我没想到。但它(你发布的解决方案)仍然给我同样的问题
  • @DavidC.Rankin 那么有没有办法像我想要的那样使用 grep 的数组进行大括号扩展?

标签: bash grep command-substitution brace-expansion


【解决方案1】:
#!/bin/bash

myJobs=( 20197695, 20261798 )
ifs_ini="$IFS"
IFS+=','
myJobs_string=( ${myJobs[*]} )
IFS="$ifs_ini"

echo myJobs ${myJobs[@]}
echo myJobs_string ${myJobs_string[@]}
echo jobReports/NARX_{${myJobs_string[@]}}*.out
grep -c 'Saving results to.*$' jobReports/NARX_{"$myJobs_string"}*.out
bash --version

输出

myJobs 20197695 20261798
myJobs_string 20197695 20261798
jobReports/NARX_{20197695 20261798}*.out
<not tested>

PS:grep -c ...echo $( echo grep ... | wc -l ) 相同

【讨论】:

  • 我在脚本中尝试了以下内容:myJobs=( 20367893 ); ifi_ini="$IFS"; IFS+=','; myJobs_string=( ${myJobs[*]} ); IFS="$ifs_ini"; echo 'Total ' $(grep "Saving results to" jobReports/NARX_{"$myJobs_string"}*.out | wc -l) ' completed jobs'; 我得到的错误是:grep: jobReports/NARX_{20367893}*.out: No such file or directory 作为检查:grep "Saving results to" jobReports/NARX_{20367893}*.out |wc -l 给了我一个正确的计数。
  • 请用于测试我的代码。在您的中,它不是最终显示的数组。使用缩进,这里没有代码。请与shellcheck.net 联系。 @Asy
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 2013-08-26
  • 2021-06-26
  • 2022-01-21
  • 2018-06-16
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多