我在不同位置有很多文件,包括* / synth / debug / *的路径模式,所有文件都有* .list扩展名。文件如下:
MODULE XYZ
SIGNED_A 0
WIDTH 12
SIGNED_B 1
(...)
MODULE XXX
SIGNED_A 1
WIDTH 12
SIGNED_B 0
(...and so on...)
我需要在MODULE XXX之后的前3行中找到第一个具有MODULE XXX(对于XYZ依此类推)和SIGNED * 1模式的文件,然后停止搜索。在MODULE之后,SIGNED字总是出现在1-3行中。
我有类似的东西:
find . -name *.list -path "*/synth/debug/*" -type f -exec grep -FHI "MODULE XXX" -A 3 {} \; | grep "SIGNED 1" -A 3 | head -1
但得到:
find: ‘grep’ terminated by signal 13
第一次(正确)发生后,命令仍然在搜索和解析文件,这浪费了时间。
答案 0 :(得分:0)
使用awk
find . -name *.list -path "*/synth/debug/*" -type f -exec awk '/MODULE XXX/{xxx=1;next}xxx{xxx+=1}/SIGNED.*1/&&xxx<=4{print FILENAME; exit}xxx>4{nextfile;}ENDFILE{xxx=0}' {} +
输出是符合您条件的第一个文件的名称
如果文件包含多个MODULE XXX块,则删除xxx>4{nextfile;}
以1个命令处理每个模块:
find . -name *.list -path "*/synth/debug/*" -type f -exec awk '/MODULE/{current=$2; line=1; next}current in results{next;}{line+=1}/SIGNED.*1/&&line<=4{results[current]=FILENAME}END{for(module in results){print module, results[module]}}' {} +
输出:模块名称+第一个文件匹配条件:
ABC file2.txt
XXX file1.txt
XYZ file1.txt