使用多个 grep 查找

find with multiple greps

我需要在 malloc 之后找到不包含单词 null 的代码行, 这样我就可以了解是否正确检查了 malloc。

例如,应打印以下行:

obj = (boolean *) malloc(DAYS_IN_WEEK * sizeof(boolean));
    for(int i = 0; i < DAYS_IN_WEEK; i++){

此命令部分有效,因为它打印出包含 malloc

的行
find . -type f -name '*.c' \( -exec grep -HnA2 'malloc' {}  \;

我应该再添加一个 grep 吗?不知道该怎么做。

一定有更简单的方法,但这似乎很接近:

find . -name "*.c" -exec grep -nHA1 malloc {} \; | 
   awk '/^--/ {next} /malloc/{f=1; p=[=10=]; next} f==1 && !/NULL/{f=0; print p; print [=10=]}'

解释:

  • /^---/ {next} 忽略 grep 生成的所有以破折号开头的行
  • /malloc/{f=1;p=[=13=];next} 设置标志 f 如果该行包含 malloc 然后记住 p 中的行并移动到下一个
  • f=1... 检查是否设置了标志(即上一行包含 malloc)并且当前行不包含 NULL,如果是,则打印上一行和当前行