计算包含bash中两个特定字符串的目录中的文件数

时间:2018-09-30 12:05:49

标签: bash awk sed grep find

在包含以下模式的目录中,我的文件很少:

Simulator tool completed simulation at 20:07:18 on 09/28/18.
The situation of the simulation: STATUS PASSED

现在,我要计算文件中任何位置都包含字符串completed simulationSTATUS PASSED的文件的数量。

此命令正在搜索一个字符串STATUS PASSED并计算文件编号:

find /directory_path/*.txt -type f -exec grep -l "STATUS PASSED" {} + | wc -l

Sed的结果也为0:

find /directory_path/*.txt -type f -exec sed -e '/STATUS PASSED/!d' -e '/completed simulation/!d' {} + | wc -l

任何帮助/建议都非常有用!

3 个答案:

答案 0 :(得分:0)

命令find /directory_path/*.txt仅列出/directory_path/中的所有txt文件,不包括/directory_path的子目录

find . -name \*.txt -print0 |
while read -d $'\0' file; do
  grep -Fq 'completed simulation' "$file" &&
  grep -Fq 'STATUS PASSED' "$_" &&
  echo "$_"
done |
wc -l

如果您确保文件名中没有特殊字符

find . -name \*.txt |
while read file; do
  grep -Fq 'completed simulation' "$file" &&
  grep -Fq 'STATUS PASSED' "$file" &&
  echo "$file"
done |
wc -l

我没有AIX可以对其进行测试,但是它应该符合POSIX。

答案 1 :(得分:0)

find . -type f -exec \
awk '/completed simulation/{x=1} /STATUS PASSED/{y=1} END{if (x&&y) print FILENAME}' {} \; |
wc -l

我正在打印匹配的文件名,以防在其他情况下有用,但是如果文件名包含换行符,则将wc传递到管道会失败-如果是这种情况,只需从awk中打​​印1或其他任何内容即可。

由于find /directory_path/*.txt -type fls /directory_path/*.txt相同,所以如果所有的“ .txt”都是文件,那么听起来您实际上需要的就是(为{{1}使用GNU awk }):

nextfile

或任何awk:

awk '
    FNR==1 { x=y=0 }
    /completed simulation/ { x=1 }
    /STATUS PASSED/        { y=1 }
    x && y { cnt++; nextfile }
    END { print cnt+0 }
' /directory_path/*.txt

无论文件名中包含什么字符,这些文件都可以使用。

答案 2 :(得分:0)

使用grep和标准工具:

{ grep -Hm1 'completed simulation' /directory_path/*.txt;
  grep -Hm1 'STATUS PASSED'        /directory_path/*.txt ; } |
sort | uniq -d | wc -l

grep -m1在找到第一个匹配项时停止。如果文件很大,可以节省时间。如果匹配项列表很大,那么sort -t: -k1会比sort更好。