在包含以下模式的目录中,我的文件很少:
Simulator tool completed simulation at 20:07:18 on 09/28/18.
The situation of the simulation: STATUS PASSED
现在,我要计算文件中任何位置都包含字符串completed simulation
和STATUS 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
任何帮助/建议都非常有用!
答案 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 f
与ls /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
更好。